0

我正在使用规则来使用正则表达式在 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']
4

2 回答 2

1

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

带减号的状态机

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

带加号的状态机

因为唯一接受+的块是第一个块,而第一个块中没有space。因此,如果正则表达式识别加号,则匹配将没有任何空格。

于 2020-04-08T19:33:00.867 回答
1

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

您可以使用的是强制数字匹配部分,同时使连字符/空格模式可选,并用可选组包装它,(?:[0-9]+[-\s]*)?. 此外,如果将最后一个[-\s\./0-9]*模式重新分解为(?:[-\s./]*[0-9])*.

利用

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

查看正则表达式演示

细节

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