Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 - Fatal编程技术网

Python正则表达式替换运算符后无组

Python正则表达式替换运算符后无组,python,regex,Python,Regex,我用python编写了一个正则表达式匹配模式,但是re.match()不在| alternation操作符之后捕获组 模式如下: pattern = r"00([1-9]\d) ([1-9]\d) ([1-9]\d{5})|\+([1-9]\d) ([1-9]\d) ([1-9]\d{5})" 我向模式输入一个限定字符串:“+1234567890”: 没有打印 Buf如果我在|替换运算符之前删除零件 strng = "+12 34 567890" pattern = r"\+([1-9]\d

我用python编写了一个正则表达式匹配模式,但是re.match()不在| alternation操作符之后捕获组

模式如下:

pattern = r"00([1-9]\d) ([1-9]\d) ([1-9]\d{5})|\+([1-9]\d) ([1-9]\d) ([1-9]\d{5})"
我向模式输入一个限定字符串:
“+1234567890”

没有打印

Buf如果我在|替换运算符之前删除零件

strng = "+12 34 567890"

pattern = r"\+([1-9]\d) ([1-9]\d) ([1-9]\d{5})"
m = re.match(pattern, strng)
print(m.group(1))
它可以捕获所有3个组:

12
34
567890

非常感谢你的想法

“|”
与组的索引无关,索引总是在正则表达式本身中从左到右计数

在原始正则表达式中,它们是6个组:

In [270]: m.groups()
Out[270]: (None, None, None, '12', '34', '567890')
匹配部分是第二部分,因此您需要:

In [271]: m.group(4)
Out[271]: '12'

您希望支持两种不同的模式,一种是
00
模式,另一种是
+
模式。您可以使用以下方法合并备选方案:

看到了吗

正则表达式测试站点的正则表达式前面有
^
(字符串开头),因为
re.match
仅在字符串开头匹配。现在,整个模式匹配:

  • ^
    -字符串的开头(隐式在
    重新匹配中
  • (?:00 | \+)
    -a
    00
    +
    子字符串
  • ([1-9]\d)
    -捕获组1:从
    1
    9
    的数字,然后是任意数字
  • -一个空格(替换为
    \s
    以匹配任何1个空格字符)
  • ([1-9]\d)
    -捕获组2:从
    1
    9
    的数字,然后是任意数字
  • -一个空格(替换为
    \s
    以匹配任何1个空格字符)
  • ([1-9]\d{5})
    -捕获第3组:从
    1
    9
    的一个数字,然后是任意5个数字
  • $
    -字符串结束

如果不需要匹配数字后面的字符串结尾,请删除
$

是。。。愚蠢的我。非常感谢您的清理!!:非常感谢您的详细解释!我在你的帖子中学到了一项新技能(非捕获组)。@Elle你确定不希望整个字符串与正则表达式匹配吗?如果你知道,那么我的答案是正确的。
In [271]: m.group(4)
Out[271]: '12'
import re
strng = "+12 34 567890"
pattern = r"(?:00|\+)([1-9]\d) ([1-9]\d) ([1-9]\d{5})$"
m = re.match(pattern, strng)
if m:
    print(m.group(1))
    print(m.group(2))
    print(m.group(3))
12
34
567890