正则表达式结果前的前导空格

a leading whitespace before the result from regular expression

我正在使用规则通过正则表达式获取 python 中的子字符串。但我发现有些结果会有一个前导空格,而有些则没有。我知道我可以使用 .strip() 删除空格。但我想了解为什么会有空格。有人可以帮忙吗?

谢谢

Ex 1.(无前导空格)。

import re
utterance = 'can i make a call to +21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

结果:

['+21231313']

Ex 2.(前导空格)。

import re
utterance = 'can i make a call to -21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

结果:

[' -21231313']

Ex 3.(前导空格)。

import re
utterance = 'can i make a call to 21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

结果:

[' 21231313']

在 RE 中,* 将检查表达式的 0 次或多次出现。因此 space 仅出现在正则表达式的最后一个块中,其他块都被解释为空。看看状态机:

最后一个块 ([-\s\./0-9]*) 将接受任何数量的列出的符号,包括 space 和符号 - 但不包括 +。如果您的表达式带有加号,则结果将为:

因为接受+的块只有第一个块,而第一个块中没有space。因此,如果正则表达式识别加号,匹配将不会有任何 spaces.

第一个模式块可以匹配一个空字符串,'[-|#|+]*[0-9]*[-\s]*[(]{0,1}

你可以使用的是使数字匹配部分成为强制性的,同时使 hyphen/space 模式成为可选的,并用可选组 (?:[0-9]+[-\s]*)? 包装它。此外,如果将最后一个 [-\s\./0-9]* 模式重构为 (?:[-\s./]*[0-9])*.

,则可以避免匹配结束时出现空格

使用

[-#+]*(?:[0-9]+[-\s]*)?\(?[0-9]{1,4}\)?(?:[-\s./]*[0-9])*
      ^^^^^^^^^^^^^^^^^                ^^^^^^^^^^^^^^^^^^  

regex demo

详情

  • [-#+]* - 零个或多个 -#+
  • (?:[0-9]+[-\s]*)? - 可选的非捕获组匹配 1 次或 0 次出现的 1+ 数字,然后是 0+ hyphens/whitespaces
  • \(? - 一个可选的 (
  • [0-9]{1,4} - 一到四位数
  • \)? - 一个可选的 )
  • (?:[-\s./]*[0-9])* - 出现 0 次或多次
    • [-\s./]* - 0 个或多个连字符、空格、./
    • [0-9] - 一个数字。