[英]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 的错误。匹配“.”的表达式是什么? 在上面的代码中? 如果存在“-”而不是“.”,则相同
这里有两个问题。
.
很特别。 它的意思是“匹配任何字符之一”。 但是,您正在尝试使用它来匹配常规时间段。 (它确实会匹配那个,但它也会匹配其他所有内容。)相反,要匹配句点,您需要使用模式\.
. 要更改它以匹配句点或连字符,您可以使用 class,例如[-.]
。\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.