繁体   English   中英

正则表达式使用 re.search() 匹配整个单词和标点符号

[英]regex match whole word and punctuation with it using re.search()

正则表达式的新手。 目标 - 匹配可能包含“.”的整个单词或末尾带有“-”。 我想保留它用于 .start() 和 .end() position 计算。

txt = "The indian in. Spain."
pattern = "in."

x = re.search(r"\b" + pattern + r"\b" , txt)

print(x.start(), x.end())

我想要 position 表示“in”。 单词,如突出显示的“西班牙的印第安人” 我使用的表达式给出了 N.netype object 的错误。匹配“.”的表达式是什么? 在上面的代码中? 如果存在“-”而不是“.”,则相同

这里有两个问题。

  1. 在正则表达式. 很特别。 它的意思是“匹配任何字符之一”。 但是,您正在尝试使用它来匹配常规时间段。 (它确实会匹配那个,但它也会匹配其他所有内容。)相反,要匹配句点,您需要使用模式\. . 要更改它以匹配句点或连字符,您可以使用 class,例如[-.]
  2. 您在模式末尾使用\b来匹配单词边界,但\b定义为单词字符和非单词字符之间的边界,句点和空格都是非单词字符。 这意味着 Python 找不到匹配项。 相反,您可以使用前瞻断言,它将匹配您想要的任何字符,但不会使用字符串。

现在,要匹配整个单词 - 任何单词 - 您可以执行类似\w+的操作,它匹配一个或多个单词字符。

此外,很可能无论如何都不会匹配,因此您应该使用if语句或try语句检查是否发生了匹配。 把它们放在一起:

txt = "The indian in. Spain."
pattern = r"\w+[-.]"
x = re.search(r"\b" + pattern + r"(?=\W)", txt)
if x:
    print(x.start(), x.end())

编辑

上面的先行断言存在一个问题——它不会匹配字符串的末尾。 这意味着如果您的文本是The rain in Spain. 那么它将与Spain. , 因为在最后一个句号之后没有非单词字符。

要解决此问题,您可以使用否定先行断言,它在以下文本包含模式时匹配,也不使用字符串。

x = re.search(r"\b" + pattern + r"(?!\w)", txt)

当单词后面的字符不是单词字符(包括字符串结尾)时,这将匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM