如何在python中的字符类中编写单词边界而不失其含义?我希望在单词边界的定义中添加下划线(_)(\ b)

时间:2017-01-04 09:53:30

标签: python regex

我知道单词边界的定义是(?<!\w)(?=\w)|(?<=\w)(?!\w) 我希望在单词边界的定义中添加下划线(可选)。

这样做的一种方法是我们可以简单地修改定义 像新的那样(_)?((?<!\w)(?=\w)|(?<=\w)(?!\w)) ,但不要使用太长时间的表达。

简易方法即可 如果我可以在字符类中编写单词边界,那么就像[\b-]一样在字符类中添加下划线很容易,但问题是将\b放在字符类中,即[\b],意味着后空格不是字边界。

请告诉解决方案,即如何将\b置于字符类中而不会失去其原始含义。

1 个答案:

答案 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_])否定前瞻将使匹配失败,如果除了非词和_字符之外没有其他字符(也就是说,需要字符串的结尾)或不包括_)的字词。