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

时间:2018-03-16 04:02:56

标签: python regex python-2.x

我正在尝试匹配一个六位数版本(由点.分隔),让我们说9.130.46.32.6.2并且它工作正常但它匹配七位数版本(由点{{1分隔)还有,让我们说.,如何确保它只匹配六位数而不是其他任何东西?

9.130.46.32.6.2.1'

8 个答案:

答案 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/1https://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']]