我有几个单词和短语是我想匹配的。如果它们被空格或标点符号(包括下划线)包围,我只想匹配它们。但如果它们周围都是字母,我就不想和它们相匹配。
例如,regex应该匹配
[
'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'
]我编写这条python是为了查看我的words_to_match列表。但当它被下划线或数字包围时,我很难匹配。
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 ##我想要这个匹配 没有匹配的“免费的钱”在免费的钱##我想要这个匹配 没有匹配的“免费的钱”在短信我“无菌钱” 在无菌货币中没有匹配的“免费货币” 无忧无虑的钱中没有匹配的“免费钱” 在自由钱币中没有匹配的“免费货币”
发布于 2020-07-28 00:10:23
您可以使用(?<![a-z])free money(?![a-z])代替。
\b匹配由\w匹配的字符和\w不匹配的字符之间的匹配,而不使用任何字符。\w翻译为[A-Za-z0-9_],但您只希望[a-z]不遵守您的诺言。因此,您可以使用negative look-around代替。
详细信息
(?<![a-z]):[a-z]必须在f之前不匹配
(?![a-z]):[a-z]必须在y之后不匹配
代码:
regex = re.compile(fr'(?<![a-z]){word}(?![a-z])'.format(word=word))产出:
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发布于 2020-07-28 14:09:01
我认为这是可行的:
r'^(?:.*[^A-Za-z]|)free money(?:[^A-Za-z].*|)$'解释:
https://stackoverflow.com/questions/63125241
复制相似问题