微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单词边界以匹配开头/结尾处包含点 (.) 的字符串

如何解决单词边界以匹配开头/结尾处包含点 (.) 的字符串

我有一个正则表达式来匹配长文本中的,如下所示:

word = "word"
text = "word subword word"

def char_regex_ascii(word):
    return r"\b{}\b".format(re.escape(word))

r = re.compile(my_regex(word),flags= re.X | re.UNICODE)
for m in r.finditer(text):
    print(m)

输出

word
word

\b 的原因是我不想找到子串,而是完整的词:例如我对匹配单词 word 不感兴趣文本 subword,但我只想要完整的单词作为结果,所以后面或前面有空格、逗号、点或任何类型的标点符号

它适用于大多数情况,但如果我在单词的末尾插入一个点,如 w.o.r.d. 它不匹配,因为正则表达式的最后一个 \b一个点之后。

word = "w.o.r.d."
text = "w.o.r.d. subword word"

def char_regex_ascii(word):
    return r"\b{}\b".format(re.escape(word))

r = re.compile(my_regex(word),flags= re.X | re.UNICODE)
for m in r.finditer(text):
    print(m)

输出

(nothing)

我看到使用 \B 使它工作,但我应该在句子的开头和结尾做几次检查,尝试对许多单词尝试 \b\B 的所有组合找到。

word = "w.o.r.d."
text = "w.o.r.d. subword word"

def char_regex_ascii(word):
    return r"\b{}\B".format(re.escape(word))

r = re.compile(my_regex(word),flags= re.X | re.UNICODE)
for m in r.finditer(text):
    print(m)

输出

w.o.r.d.

是否存在通用方法

解决方法

您可以将正则表达式模式 \w+(?:\.?\w+)*re.findall 一起使用:

text = "w.o.r.d. subword word"
matches = re.findall(r'\w+(?:\.?\w+)*',text)
print(matches)  # ['w.o.r.d','subword','word']

此处使用的模式将“单词”定义为:

\w+         one or more word characters
(?:
    \.?\w+  followed by optional dot and one or more
            word characters
)*          zero or more times

在此定义下,首字母缩略词样式术语(例如 w.o.r.d.)将被捕获为匹配项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。