我在python中写了一个正则表达式匹配模式,但是re.match()不会在|之后捕获组交替运营商。
以下是模式:
pattern = r"00([1-9]\d) ([1-9]\d) ([1-9]\d{5})|\+([1-9]\d) ([1-9]\d) ([1-9]\d{5})"
我使用限定字符串提供模式:"+12 34 567890"
:
strng = "+12 34 567890"
pattern = r"00([1-9]\d) ([1-9]\d) ([1-9]\d{5})|\+([1-9]\d) ([1-9]\d) ([1-9]\d{5})"
m = re.match(pattern, strng)
print(m.group(1))
没有打印。
如果我在删除之前删除了部分交替运营商
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
非常感谢您的想法!
答案 0 :(得分:1)
O(n)
与group的索引无关,索引总是在正则表达式中从左到右计算。
在你原来的正则表达式中,他们是6组:
'|'
匹配部分是第二部分,因此您需要:
In [270]: m.groups()
Out[270]: (None, None, None, '12', '34', '567890')
答案 1 :(得分:0)
您希望支持两种不同的模式,一种是+
,另一种是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))
。您可以使用non-capturing group
12
34
567890
请参阅regex demo和Python demo让步
^
正则表达式测试站点的正则表达式前面加上re.match
(字符串的开头),因为^
仅匹配字符串的开头。整个模式现在匹配:
re.match
- 字符串的开头(隐含在(?:00|\+)
)00
- +
或([1-9]\d)
子字符串1
- 捕获第1组:从9
到
的数字,然后是任意数字\s
- 一个空格(替换为([1-9]\d)
以匹配任何1个空白字符)1
- 捕获第2组:从9
到
的数字,然后是任意数字\s
- 一个空格(替换为([1-9]\d{5})
以匹配任何1个空白字符)1
- 捕获第3组:从9
到$
的数字,然后是任意5位数字$
- 字符串结束。如果您不需要在数字后面匹配字符串的结尾,请删除let uncombine s =
let rec ayx s1 s2 sr =
match s () with
| Nil -> s1, s2
| Cons(((e1, e2), sr) -> aux (append s1 (singleton e1)) (append s2 (s(singleton e2)) sr
in aux nil nil
。