我有一个像这样的正则表达式: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.'>
我想知道是否有一种方法可以修改正则表达式以使其捕获句点(当它实际出现在文本中时)。
编辑:更新了正则表达式以适应“数字”的单数和复数形式
可能的输入字符串可能是:
我为“credit card no”包含了潜在误报匹配的词边界,因为它可以匹配像“credit card notification”这样的字符串而没有分词
您需要使用 \b
来断言单词的结尾,仅在单词字符之后:
r'credit\s+card\s+(?:numbers?\b|no(?:s\b|\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
后面没有跟单词 char
|
- 或者
\b\.
- 单词边界和一个点。
注意:如果您不想在.
之后出现任何单词字符,请添加\B
非单词边界,\b\.
=> \b\.\B
.
我是一名优秀的程序员,十分优秀!