为什么这个正则表达式:
r'^(?P<first_init>\b\w\.\b)\s(?P<mid_init>\b\w\.\b)\s(?P<last_name>\b\w+\b)$'
与J. F. Kennedy
不匹配?
我必须删除小组\b
和first_init
中的mid_init
才能匹配这些字词。
我正在使用Python。对于测试,我正在使用https://regex101.com/
由于
答案 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
。