我有这样一个正则表达式:r"credit\s+card\s+(?:numbers?|no[s\.]?)\b"
。我想匹配一个短语,如“信用卡号码”(包括期间)。但是,它目前只匹配短语之前期间的部分
>>> re.search(r"credit\s+card\s+(?:numbers?|no[s\.]?)\b", "credit card no.")
# <re.Match object; span=(0, 14), match='credit card no'>
这似乎与分词符号\b
(以及no
和.
之间有分词的事实有关:如果我去掉\b
,整个短语可以匹配:
>>> re.search(r"credit\s+card\s+(?:numbers?|no[s\.]?)", "credit card no.")
# <re.Match object; span=(0, 15), match='credit card no.'>
我想知道是否有一种方法可以修改regex,使其捕获句点(当它实际出现在文本中时)
编辑: 更新regex以适应“number”的单数和复数形式
可能的输入字符串可以是:
我为“credit card no”添加了潜在误报匹配的单词boundary,因为它可以匹配像“credit card notification”这样的字符串,而不需要单词break
您需要使用
\b
来声明单词的结尾,仅在单词字符之后:参见regex demo
(?:numbers?|no[s\.]?)\b
变为(?:numbers?\b|no(?:s\b|\b\.)?)
并匹配:numbers?\b
-number
或numbers
作为整词,不允许在这些字符串的右边立即出现单词字符|
-或no
-no
子串后跟李>(?:s\b|\b\.)?
-可选的1或0次:s\b
-s
后面没有字符|
-或\b\.
-单词边界和一个点李>注意:如果不希望任何单词字符出现在
.
之后,请添加\B
非单词边界,\b\.
=>\b\.\B
相关问题 更多 >
编程相关推荐