如何匹配 *仅* 六位数版本?

How to match *only* a six digit version?

我正在尝试匹配六位数版本(由点 . 分隔),比方说 9.130.46.32.6.2 它工作正常,但它匹配七位数版本(由点 [= 分隔) =11=]) 还有,比方说 9.130.46.32.6.2.1',如何确保它只匹配六位数字版本而不匹配其他任何版本?

import re
version = '9.130.46.32.6.2' (six digit) -->SHOULD MATCH
version = '9.130.46.32.6.2.1'(seven digit) --> SHOULD NOT MATCH

#if the version is six digit append a ".0" as 4th digit

regex = re.compile(r'\d+\.\d+\.\d+\.\d+\.\d+\.\d+')
m = regex.match(version)
if m:
    print "Its a six digit version..."
    digit1 = version.split('.')[-6]
    print digit1
    digit2 = version.split('.')[-5]
    print digit2
    digit3 = version.split('.')[-4]
    print digit3
    digit4 = version.split('.')[-3]
    print digit4
    digit5 = version.split('.')[-2]
    print digit5
    digit6 = version.split('.')[-1]
    print digit6
    new_version = digit1 + "."+ digit2 + "." + digit3 + "."+  "0." + digit4 + "." + digit5 + "." + digit6
print new_version

通过锚定正则表达式。

r'^\d+\.\d+\.\d+\.\d+\.\d+\.\d+$'

不使用 compile,获取 IP 中的所有数字并检查其长度:

import re
versions = ['9.130.46.32.6.2', '9.130.46.32.6.2.1']
new_versions = [i for i in versions if len(re.findall('\d+', i)) == 6]

输出:

['9.130.46.32.6.2']

这个怎么样:

^([0-9]+\.){5}[0-9]+$

或使用负前瞻。

^([0-9]+\.){5}[0-9]+(?!\.\d+)

参见:https://regex101.com/r/o0uNTy/1 and https://regex101.com/r/o0uNTy/2

使用re.match时的正则表达式匹配可以是字符串的任何前缀,所以你需要通过匹配字符串的结尾来锚定它\Z。 ($ 类似于 Python 正则表达式中的 \Z,但可以匹配结尾的换行符。)

如果您不想匹配更广泛的 Unicode 数字类别(如 ١.٢.٣.٤.٥.٦),您可能还应该使用 [0-9]。总体:

r"(?:[0-9]+\.){5}[0-9]+\Z"

另一种选择是使用负前瞻:

regex = re.compile(r'\d+\.\d+\.\d+\.\d+\.\d+\.\d+(?!\.\d+)')

这将明确禁止 . 后跟您的匹配项后面的数字序列。如果您尝试在字符串中搜索版本号并且只想匹配由 6 部分组成的变体,这将非常有趣。

如果您已经将版本隔离为字符串,那么锚定是更合适的解决方案(或者只是拆分 . 并且根本不使用正则表达式)。

# if the version is six numbers long insert a "0" as 4th number
fields = version.split(".")
if len(fields) == 6:
    fields = fields[0:3] + ["0"] + fields[3:6]

# `fields` now contains 7 numbers
print ".".join(fields)

方法re.match将匹配字符串的任何前缀。如果您使用 Python3,请使用 re.fullmatch,它只会匹配完整的字符串。您甚至可以使用捕获组将 '.0' 添加为第四位数字。

version = '9.130.46.32.6.2'

regex = re.compile(r'(\d+\.\d+\.\d+)(\.\d+\.\d+\.\d+)')

m = regex.fullmatch(version)

if m:
    new_version = m[1] + '.0' + m[2] # '9.130.46.0.32.6.2'

这是一个七位数版本的示例。

version = '9.130.46.32.6.2.1'

m = regex.fullmatch(version) # None

你可以简单地做:

import re
pattern=r'\d+'

print([re.findall(pattern,line) for line in open('text.txt','r') if len(re.findall(pattern,line))==6])

输出:

[['9', '130', '46', '32', '6', '2']]