带有\ b和非单词字符的正则表达式(如'。')

时间:2016-04-11 22:40:14

标签: python regex

为什么这个正则表达式: r'^(?P<first_init>\b\w\.\b)\s(?P<mid_init>\b\w\.\b)\s(?P<last_name>\b\w+\b)$'J. F. Kennedy不匹配?

我必须删除小组\bfirst_init中的mid_init才能匹配这些字词。 我正在使用Python。对于测试,我正在使用https://regex101.com/

由于

5 个答案:

答案 0 :(得分:3)

您过度使用\b 分词

\b 匹配,如果一边有有效的&#34;字&#34;性格,另一方面没有。现在你使用这种结构两次:

\b\w\.\b\s

..而且,这是正确的,它不匹配,因为在左侧你有一个非单词字符(一个句号),另一方面你没有 - 字符(空格)。

删除句号和\b之间的\s就足以使其正常工作。

答案 1 :(得分:1)

\b仅在单词的开头或结尾处匹配空字符串。单词是一系列字母数字或下划线字符。点(.)不能构成单词的一部分。

>>> import re
# does not match when \. is within word boundary
>>> re.match(r'^(?P<first_init>\b\w\.\b)\s(?P<mid_init>\b\w\.\b)\s(?P<last_name>\b\w+\b)$', 'J. F. Kennedy')
# matches when \b is moved to left of \.
>>> re.match(r'^(?P<first_init>\b\w\b\.)\s(?P<mid_init>\b\w\b\.)\s(?P<last_name>\b\w+\b)$', 'J. F. Kennedy')  # matches

在这个意义上,.不是这个词的一部分。请参阅docs here

答案 2 :(得分:1)

只需删除第二个边界:

^(?P<first_init>\b\w\.)\s
(?P<mid_init>\b\w\.)\s
(?P<last_name>\b\w+\b)$

a demo on regex101.com 背景是第二个\b在点和空格之间,所以它失败了(记住其中一个边需要是一个单词字符,即a-zA-Z0-9_之一)

答案 3 :(得分:1)

由于\.(点)字符,它不匹配。单词边界不包括点(它可能与您想要的 word 的定义不同)。您可以轻松地重写它而无需\b。仔细阅读documentation

答案 4 :(得分:0)

\ b表示单词的边框。

Word这里定义如下:

  

当一个单词后面有空格字符时,单词结束。

“J。”,“F。”这里的话就是“肯尼迪”。

您的示例是尝试在字母和点之间搜索空格,并且正在搜索J . F . Kennedy