Python:无法匹配后跟单词b的句点(在非捕获组中)

2024-06-07 18:42:12 发布

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

我有这样一个正则表达式: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


Tags: no字符串researchobjectmatchcard信用卡
1条回答
网友
1楼 · 发布于 2024-06-07 18:42:12

您需要使用\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-numbernumbers作为整词,不允许在这些字符串的右边立即出现单词字符
  • |-或
  • no-no子串后跟
  • (?:s\b|\b\.)?-可选的1或0次:
    • s\b-s后面没有字符
    • |-或
    • \b\.-单词边界和一个点

注意:如果不希望任何单词字符出现在.之后,请添加\B非单词边界,\b\.=>\b\.\B

相关问题 更多 >

    热门问题