Python正则表达式替换运算符后无组
我用python编写了一个正则表达式匹配模式,但是re.match()不在| alternation操作符之后捕获组 模式如下: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
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
仅在字符串开头匹配。现在,整个模式匹配:
-字符串的开头(隐式在^
)重新匹配中
-a(?:00 | \+)
或00
子字符串+
-捕获组1:从([1-9]\d)
到1
的数字,然后是任意数字9
-一个空格(替换为
以匹配任何1个空格字符)\s
-捕获组2:从([1-9]\d)
到1
的数字,然后是任意数字9
-一个空格(替换为
以匹配任何1个空格字符)\s
-捕获第3组:从([1-9]\d{5})
到1
的一个数字,然后是任意5个数字9
-字符串结束$
如果不需要匹配数字后面的字符串结尾,请删除
$
。是。。。愚蠢的我。非常感谢您的清理!!:非常感谢您的详细解释!我在你的帖子中学到了一项新技能(非捕获组)。@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