Python 如何使正则表达式使用三个由连字符分隔的特定数字?
当我有3个用连字符分隔的特定数字时,我试图让这个正则表达式工作。正则表达式在没有连字符的情况下工作。有人能告诉我如何解决这个问题吗。我尝试了\d+-的组合,但没有任何效果。多谢各位 本例中的数字为012。我试图让正则表达式匹配0-1-2的所有组合 进口稀土 fname=('regextest.txt') fh=打开(fname) RegEx012=重新编译(r'\b(?=[1-9]*0)(?=[02-9]*1)(?=[013-9]*2)\d+\b') 对于fh中的i:Python 如何使正则表达式使用三个由连字符分隔的特定数字?,python,regex,re,Python,Regex,Re,当我有3个用连字符分隔的特定数字时,我试图让这个正则表达式工作。正则表达式在没有连字符的情况下工作。有人能告诉我如何解决这个问题吗。我尝试了\d+-的组合,但没有任何效果。多谢各位 本例中的数字为012。我试图让正则表达式匹配0-1-2的所有组合 进口稀土 fname=('regextest.txt') fh=打开(fname) RegEx012=重新编译(r'\b(?=[1-9]*0)(?=[02-9]*1)(?=[013-9]*2)\d+\b') 对于fh中的i: if RegEx012.f
if RegEx012.findall(i):
print(i)
文件中的数据:
0-1-2
0-1-4
0-2-1
0-4-1
1-0-2
1-0-4
1-2-0
1-4-0
2-0-1
2-1-0
4-0-1
4-0-2
4-1-0
期望结果:
0-1-2
0-2-1
1-0-2
1-2-0
2-0-1
2-1-0
我的理解是,对于给定的字符串,我们要匹配大小为5的每个子字符串,该子字符串是字符串
'012'
中字符的排列,第一位和第二位之间有一个连字符,第二位和第三位之间有一个连字符
例如,对于字符串:
There are 2-1-0 reasons to buy 1-2-0 dogs, but only 1-2-1 to buy 0-2-1 cats
2-1-0
,1-2-0
和0-2-1
(但不是1-2-1
)将匹配
这可以通过以下正则表达式完成:
r'\b(([012])-(?!\2)([012])-(?!\2|\3)[012])\b'
与其他捕获组一样,捕获匹配项的捕获组1是
re.findall
所需要的。您能告诉我们更多的要求吗?所有数字的长度都应该是3吗?什么是有效数字?另外,你能包括你在用什么程序吗?我在python中使用这个正则表达式。总共有三位数字,只能与以下六位数字匹配。0-1-20-2-11-0-21-2-02-0-12-1-0这还不是很清楚。实际允许值是多少。只有您已经显示的,例如:123
是不允许的?正确。在python中使用for循环时,我只希望匹配列出的值,而不希望匹配其他值。我还将使用其他三位数的正则表达式,但当我有了这个正则表达式的解决方案时,我可以将更改应用到其余的正则表达式。但问题是相同的,当数字中有连字符时,我无法过滤掉任何3位数字的6个变体。谢谢。所有这些都是你应该在你的帖子中包含的信息,而不是把它们放在评论中。谢谢你的工作做得很好。我忘了补充一句,我希望对特定数字和通配符也这样做。包含0和1的任何数字。示例:01。结果0-1-0,1-0-2,2-0-1,1-0-3,等等。您可能需要一个0
和一个1
(还有一个数字)具有两个正面外观的头:\b(?=[\d-]*0)(?=[\d-]*1)\d-\d\b
。这两个方法非常有效。谢谢,我遇到了另一个问题。当两个数字相同时,正则表达式不起作用。例如00。它与01一起工作。
\b : assert word boundary
( : begin capture group 1
([012]) : match one char in class in capture group 2
- : match '-'
(?!\2) : negative lookahead asserts next char does not
equal the contents of capture group
([012]) : match one char in class in capture group 3
- : match '-'
(?!\2|\3) : negative lookahead asserts next char does not
equal the contents of capture group 2 or 3
[012] : match one char in class
) : end capture group 1
\b : assert word boundary