在交替运算符

时间:2018-05-18 15:15:44

标签: python regex

我在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

非常感谢您的想法!

2 个答案:

答案 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 demoPython 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