当前位置: 首页 > 面试题库 >

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

庄嘉
2023-03-14
问题内容

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

一种实现方法是,我们可以像新定义一样简单地修改定义(_)?((?<!\w)(?=\w)|(?<=\w)(?!\w)) ,但是不希望使用太长的表达式。

简便的方法可以是:如果我可以在字符类内部编写单词边界,则在字符类内部添加下划线就像一样非常容易[\b-],但是问题是放在\b字符类内部,即[\b],意味着退格字符不是单词边界。

请告诉解决方案,即如何\b在不丢失其原始含义的情况下放入字符类。


问题答案:

您可以使用环顾四周:

(?:\b|(?<=_))word(?=\b|_)
^^^^^^^^^^^^^     ^^^^^^^

请参阅regex演示,其中(?:\b|(?<=_))是一个非捕获组,它匹配单词边界或前缀为的位置_,并且(?=\b|_)是一个正向超前匹配字词边界或_符号的匹配项。

不幸的是,Pythonre不允许使用,(?<=\b|_)因为后向模式的宽度应固定(否则,您将得到 look-behind requires fixed-width pattern 错误)。

一个Python的演示:

import re
rx = r"(?:\b|(?<=_))word(?=\b|_)"
s = "some_word_here and a word there"
print(re.findall(rx,s))

另一种解决方案是使用自定义单词边界,例如(?<![^\W_])/
(?![^\W_])(请参阅在线演示):

rx = r"(?<![^\W_])word(?![^\W_])"

(?<![^\W_])如果没有非单词和_char以外的字符,否定的lookbehind匹配失败(因此,它要求字符串的开头或任何单词char不包括搜索词_
之前 的字符),(?![^\W_])如果没有其他char
,否定的lookahead将失败而不是非单词和_字符(也就是说,要求字符串的末尾或不包括在内的单词字符_)。



 类似资料:
  • 词边界 \b 是一种检查,就像 ^ 和 $ 一样。 当正则表达式引擎(实现搜索正则表达式的程序模块)遇到 \b 时,它会检查字符串中的位置是否是词边界。 有三种不同的位置可作为词边界: 在字符串开头,如果第一个字符是单词字符 \w。 在字符串中的两个字符之间,其中一个是单词字符 \w,另一个不是。 在字符串末尾,如果最后一个字符是单词字符 \w。 例如,可以在 Hello, Java! 中找到匹配

  • 使用正则表达式匹配表达式 为什么这两个示例匹配如下(突出显示): c# < code>a #b #c #d 具体来说,为什么第一个字符串不匹配包含最后一个#之前的所有内容? 由于单词边界(\b)是零宽度匹配,可以在单词字符(\w)和非单词字符(\ w)之间匹配,或者在单词字符和字符串的开始或结束之间匹配,我不确定以非单词字符结束表达式会如何影响匹配。

  • 我正在尝试编写我的第一个Elasticsearch分析插件,我从github中找到了一个可扩展的标准Analyzer插件项目:Elasticsearch分析standardext,在该项目中它提供了以下代码: 这里是链接 我想知道如何获得这些单词边界的字符类。 我问有问题的作者:如何获得单词边界“字符类”?#2,但是作者似乎不会回答我的问题。 我尝试阅读Unicode文本分段文档:https://

  • 我正在寻找一个正则表达式来grep整个单词,包括由数字或下划线分隔的单词。\\b认为数字和下划线是单词的一部分,而不是边界。 例如,我想在“DOG-MOUSE-CAT”、“DOG-MOUSE:CAT”和“DOG\u-MOUSE9CAT”以及表达式的结尾或开头捕捉鼠标,如“MOUSE9CAT”和“DOG\u-MOUSE”。基本上,我要查找的边界是任何非大写字母字符加上行/表达式的开头和结尾(这里可能

  • 问题内容: 我想做的是一项相当普通的任务,但我在网络上找不到任何参考。我的文字带有标点符号,我想要一个单词列表。 应该 但是只能使用一个参数,因此在用空格分割后,所有单词都带有标点符号。有任何想法吗? 问题答案: 正则表达式合理的情况:

  • 问题内容: 我想在Elastisearch中使用单词边界进行正则表达式查询,但是看起来Lucene正则表达式引擎不支持。我可以使用哪些解决方法? 问题答案: 在ElasticSearch regex风格中,没有直接等效于单词边界的功能。最初是一样的东西,如果用一个字字符开始,并且尾部就像如果用一个字字符结束。 因此,我们需要确保在字符串的前后或字符串的开始/结束处有一个非单词char 。由于正则表