带有\b和非单词字符的正则表达式(如“.”)

2024-04-19 19:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这个正则表达式: 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和{}以匹配单词。 我用的是Python。为了测试,我使用https://regex101.com/

谢谢


Tags: namehttpscominit单词firstlastmid
3条回答

您过度使用了\b分词符。在

\b只有在一方有有效的“word”字符而另一方没有时,\b只匹配。现在您将使用此构造两次:

\b\w\.\b\s

。。而且,正确地说,它不匹配,因为在左边你有一个非单词字符(一个句号),而在另一边你有一个非单词字符(空格)。在

删除句号和\s之间的\b就足够让它工作了。在

\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。在

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

相关问题 更多 >