如何匹配 *仅* 六位数版本?
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']]
我正在尝试匹配六位数版本(由点 .
分隔),比方说 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']]