为了账号安全,请及时绑定邮箱和手机立即绑定

努力创建正确的正则表达式

努力创建正确的正则表达式

UYOU 2023-09-05 17:20:37
我尝试为每个“单词”(小写或大写)进行匹配:(单词|WORD)前后不能有任何字符或数字:(?<![^a-zA-Z0-9]) (word|WORD) (?![^a-zA-Z0-9])如果“word”位于字符串的开头或结尾:^| (?<![^a-zA-Z0-9])(字|WORD)(?![^a-zA-Z0-9]) |$它根本不起作用,有什么建议吗?
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

您可能正在寻找


import re


text = "123 Lorem ipsum dolor sit amet, word WORD WoRd consetetur sadipscing elitr, sed diam 123"


pattern = re.compile(r'\bword\b', re.IGNORECASE)


for word in pattern.finditer(text):

    print(word.group(0))

这会产生


word

WORD

WoRd

\b是缩写形式


(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))

其中读到


(?=\w)(?<!\w) # positive lookahead making sure there's a word character coming

              # negative lookbehind making sure theres' n word characte preceding

|             # or

(?<=\w)(?!\w) # the other way round

所以,是的


(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))word(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))

会产生与上面相同的匹配,但似乎有点不可读。


查看完整回答
反对 回复 2023-09-05
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

(?<![^a-zA-Z0-9]) 是双重否定。您是说,如果主表达式之前的字符不在 [a-zA-Z0-9] 中,则它不应该匹配,也就是说,只有当该字符在 [a-zA-Z0-9] 中时,它才能匹配。只需删除 ^: (?<![a-ZA-Z0-9])。

您使用的字符串边界 ^ 和 $ 在这里会令人困惑,但如果您使用负向后查找和负向前查找,则不需要它们。

因此,切换到(?<![a-zA-Z0-9])(word|WORD)(?![a-zA-Z0-9])

也就是说,@user3783243 关于 \b 的评论是一个更好的选择。\b 是一个“单词边界”,它准确地代表了您要捕获的内容。

查看完整回答
反对 回复 2023-09-05
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信