我知道单词边界的定义是(?<!\w)(?=\w)|(?<=\w)(?!\w)
我希望在单词边界的定义中添加下划线(可选)。
这样做的一种方法是我们可以简单地修改定义
像新的那样(_)?((?<!\w)(?=\w)|(?<=\w)(?!\w))
,但不要使用太长时间的表达。
简易方法即可
如果我可以在字符类中编写单词边界,那么就像[\b-]
一样在字符类中添加下划线很容易,但问题是将\b
放在字符类中,即[\b]
,意味着后空格不是字边界。
请告诉解决方案,即如何将\b
置于字符类中而不会失去其原始含义。
答案 0 :(得分:1)
您可以使用外观:
(?:\b|(?<=_))word(?=\b|_)
^^^^^^^^^^^^^ ^^^^^^^
请参阅regex demo其中(?:\b|(?<=_))
是一个非捕获组,与字边界或前面带有_
的位置相匹配,而(?=\b|_)
是一个正面的前瞻匹配单词边界或_
符号。
不幸的是,Python re
将不允许使用(?<=\b|_)
,因为lookbehind模式应该是固定宽度的(否则,您将得到 look-behind requires fixed-width pattern
错误)
A Python demo:
import re
rx = r"(?:\b|(?<=_))word(?=\b|_)"
s = "some_word_here and a word there"
print(re.findall(rx,s))
另一种解决方案是使用自定义字词边界,例如(?<![^\W_])
/ (?![^\W_])
(请参阅online demo):
rx = r"(?<![^\W_])word(?![^\W_])"
如果除了非单词和(?<![^\W_])
字符之外没有其他字符,那么_
否定后观就会失败匹配(因此,它需要字符串的开头或除_
之外的任何单词字符在搜索词之前)和(?![^\W_])
否定前瞻将使匹配失败,如果除了非词和_
字符之外没有其他字符(也就是说,需要字符串的结尾)或不包括_
)的字词。