我正在尝试匹配一个六位数版本(由点.
分隔),让我们说9.130.46.32.6.2
并且它工作正常但它匹配七位数版本(由点{{1分隔)还有,让我们说.
,如何确保它只匹配六位数而不是其他任何东西?
9.130.46.32.6.2.1'
答案 0 :(得分:3)
不要使用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']
答案 1 :(得分:2)
通过锚定正则表达式。
r'^\d+\.\d+\.\d+\.\d+\.\d+\.\d+$'
答案 2 :(得分:2)
# 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)
答案 3 :(得分:0)
这个怎么样:
^([0-9]+\.){5}[0-9]+$
或使用否定前瞻。
^([0-9]+\.){5}[0-9]+(?!\.\d+)
请参阅:https://regex101.com/r/o0uNTy/1和https://regex101.com/r/o0uNTy/2
答案 4 :(得分:0)
使用re.match
时的正则表达式匹配可以是字符串的任何前缀,因此您需要通过将字符串的末尾与\Z
匹配来锚定它。 ($
与Python正则表达式中的\Z
类似,但可以匹配尾随换行符。)
如果您不想匹配更广泛的Unicode数字类别(例如١.٢.٣.٤.٥.٦
),您可能还应该使用[0-9]
。总体:
r"(?:[0-9]+\.){5}[0-9]+\Z"
答案 5 :(得分:0)
另一个选择是使用否定前瞻:
regex = re.compile(r'\d+\.\d+\.\d+\.\d+\.\d+\.\d+(?!\.\d+)')
这将明确禁止跟随您的匹配后的.
后跟一系列数字。如果您尝试在字符串中搜索版本号并希望仅匹配6部分变体,那么这将非常有趣。
但是,如果您已将版本作为字符串隔离,则锚定是更合适的解决方案(或者仅在.
上拆分,并且根本不使用正则表达式。)
答案 6 :(得分:0)
方法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
答案 7 :(得分:0)
您可以这样做:
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']]