如何在python中使用正则表达式分隔单词,同时考虑带撇号的单词?

我使用单词边界在python正则表达式" title="python正则表达式">python正则表达式中尝试了单独的m,并找到它们。这些M的要么对两侧空白或开始/结束的字符串:如何在python中使用正则表达式分隔单词,同时考虑带撇号的单词?

r = re.compile("\\bm\\b") 

re.findall(r, someString)

然而,这种方法也发现类似I'm字中M的撇号以来被认为是单词边界。我如何编写一个不考虑撇号作为单词边界的正则表达式?

我已经试过这样:

r = re.compile("(\\sm\\s) | (^m) | (m$)") 

re.findall(r, someString)

但只是不匹配任何微米。奇。

回答:

使用环视断言:

>>> import re 

>>> re.findall(r'(?<=\s)m(?=\s)|^m|m$', "I'm a boy")

[]

>>> re.findall(r'(?<=\s)m(?=\s)|^m|m$', "I m a boy")

['m']

>>> re.findall(r'(?<=\s)m(?=\s)|^m|m$', "mama")

['m']

>>> re.findall(r'(?<=\s)m(?=\s)|^m|m$', "pm")

['m']

(?=...)

匹配,如果匹配...未来,但不消耗任何 字符串。这被称为前瞻断言。例如,只有跟着'Asimov',Isaac (?=Asimov)才会匹配'Isaac '。如果

(?<=...)

匹配字符串中的当前位置是由一个匹配 为...之前,在当前位置结束。这被称为正向 后向断言。 (?<=abc)def将在abcdef找到匹配,...

从Regular expression syntax

BTW,使用原始的字符串(r'this is raw string'),你不需要逃避\

>>> r'\s' == '\\s' 

True

回答:

你甚至都不需要环视(除非你想捕捉不含空格的米),但你的第二个例子是英寸。这是多余的空格(OK在python,但不是内的正则表达式),这使他们无法正常工作:

>>> re.findall(r'\sm\s|^m|m$', "I m a boy") 

[' m ']

>>> re.findall(r'\sm\s|^m|m$', "mamam")

['m', 'm']

>>> re.findall(r'\sm\s|^m|m$', "mama")

['m']

>>> re.findall(r'\sm\s|^m|m$', "I'm a boy")

[]

>>> re.findall(r'\sm\s|^m|m$', "I'm a boym")

['m']

回答:

falsetru的回答是的“\ b除了撇号”几乎等同,但并不完全。它仍然会找到缺失边界的地方。使用falsetru的一个例子:

>>> import re 

>>> re.findall(r'(?<=\s)m(?=\s)|^m|m$', "mama")

['m']

它找到“M”,但并没有在“妈妈”“M”将匹配“\ BM \ B”发生。第一个'm'与'\ bm'匹配,但是距离它很近。

实现“\ B,不含撇号”的正则表达式如下:

(?<=\s)m(?=\s)|^m(?=\s)|(?<=\s)m$|^m$ 

这将找到任何的以下4种情况:

  1. 的“m”之前和之后的空白
  2. 在开头“M”后跟空格
  3. “M”在端部由白色空间之前
  4. ' m',而在它之前或之后没有任何内容(即,只是字面意思是字符串“m”)

以上是 如何在python中使用正则表达式分隔单词,同时考虑带撇号的单词? 的全部内容, 来源链接: utcz.com/qa/262272.html

回到顶部