正则表达式结果前的前导空格
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])*
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
详情
[-#+]*
- 零个或多个 -
、#
或 +
(?:[0-9]+[-\s]*)?
- 可选的非捕获组匹配 1 次或 0 次出现的 1+ 数字,然后是 0+ hyphens/whitespaces
\(?
- 一个可选的 (
[0-9]{1,4}
- 一到四位数
\)?
- 一个可选的 )
(?:[-\s./]*[0-9])*
- 出现 0 次或多次
[-\s./]*
- 0 个或多个连字符、空格、.
或 /
[0-9]
- 一个数字。
我正在使用规则通过正则表达式获取 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])*
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
详情
[-#+]*
- 零个或多个-
、#
或+
(?:[0-9]+[-\s]*)?
- 可选的非捕获组匹配 1 次或 0 次出现的 1+ 数字,然后是 0+ hyphens/whitespaces\(?
- 一个可选的(
[0-9]{1,4}
- 一到四位数\)?
- 一个可选的)
(?:[-\s./]*[0-9])*
- 出现 0 次或多次[-\s./]*
- 0 个或多个连字符、空格、.
或/
[0-9]
- 一个数字。