Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使正则表达式使用三个由连字符分隔的特定数字?_Python_Regex_Re - Fatal编程技术网

Python 如何使正则表达式使用三个由连字符分隔的特定数字?

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

当我有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.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