首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配被标点符号和数字包围的单词

如何匹配被标点符号和数字包围的单词
EN

Stack Overflow用户
提问于 2020-07-28 00:01:17
回答 2查看 463关注 0票数 0

我有几个单词和短语是我想匹配的。如果它们被空格或标点符号(包括下划线)包围,我只想匹配它们。但如果它们周围都是字母,我就不想和它们相匹配。

例如,regex应该匹配

代码语言:javascript
复制
[
    'Text me"free money"',
    'Text me" free money please"',
    'free money',
    '12free money',
    '5free money9',
    '_free money_'
]

但不要与“免费货币”相匹配

代码语言:javascript
复制
[
    'Text me"germfree money"',
    'germfree money',
    'carefree money',
    'free moneygram'
]

我编写这条python是为了查看我的words_to_match列表。但当它被下划线或数字包围时,我很难匹配。

代码语言:javascript
复制
words_to_match = ['free money']

sentences_to_check = [
        'Text me"free money"',
        'Text me" free money please"',
        'free money',
        '12free money',
        '5free money9',
        '_free money_',
        'Text me"germfree money"',
        'germfree money',
        'carefree money',
        'free moneygram'
    ]

for word in words_to_match:
    word = word.lower()
    for sentence in sentences_to_check:
        sentence = sentence.lower()
        regex = re.compile(fr'[^a-z0-9]?(\b{word}\b)[^a-z0-9]?'.format(word=word))
        z = regex.findall(sentence)
        
        if len(z) > 0:
            print('MATCHED "' + word + '" in ' + sentence)
        else:
            print('No match "' + word + '" in ' + sentence)

给我的结果:

在短信“免费钱”中匹配“免费钱” 在短信“免费钱”中匹配“免费的钱” 免费货币中匹配的“免费货币” 没有匹配的“免费的钱”在12免费的钱##我想要这个匹配 没有匹配的“免费的钱”在5免费money9 ##我想要这个匹配 没有匹配的“免费的钱”在免费的钱##我想要这个匹配 没有匹配的“免费的钱”在短信我“无菌钱” 在无菌货币中没有匹配的“免费货币” 无忧无虑的钱中没有匹配的“免费钱” 在自由钱币中没有匹配的“免费货币”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-28 00:10:23

您可以使用(?<![a-z])free money(?![a-z])代替。

Regex Demo

\b匹配由\w匹配的字符和\w不匹配的字符之间的匹配,而不使用任何字符。\w翻译为[A-Za-z0-9_],但您只希望[a-z]不遵守您的诺言。因此,您可以使用negative look-around代替。

详细信息

(?<![a-z])[a-z]必须在f之前不匹配

(?![a-z])[a-z]必须在y之后不匹配

代码:

代码语言:javascript
复制
regex = re.compile(fr'(?<![a-z]){word}(?![a-z])'.format(word=word))

产出:

代码语言:javascript
复制
MATCHED "free money" in text me"free money"
MATCHED "free money" in text me" free money please"
MATCHED "free money" in free money
MATCHED "free money" in 12free money
MATCHED "free money" in 5free money9
MATCHED "free money" in _free money_
No match "free money" in text me"germfree money"
No match "free money" in germfree money
No match "free money" in carefree money
No match "free money" in free moneygram
票数 1
EN

Stack Overflow用户

发布于 2020-07-28 14:09:01

我认为这是可行的:

代码语言:javascript
复制
r'^(?:.*[^A-Za-z]|)free money(?:[^A-Za-z].*|)$'

解释:

  • 从输入字符串的开头开始。
  • ...Create是一个非捕获组,它包含以下任一种:
    • 任何东西(包括空字符串),后面跟着非字母、
    • 空字符串

  • ..。后面跟着“免费钱”..。
  • ..。后面跟着一个非捕获组,其中一个容器是:。
    • 非字母的,后面跟着任何东西(包括空字符串),
    • 空字符串

  • ..。直到输入字符串的末尾。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63125241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档