2013-10-12 23 views
1

我使用单词边界在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) 

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

+0

您的'\\ s'示例与任何'm'不匹配的原因是由于管道周围有额外的空间。这些都包含在搜索字符串中。否则,这对我而言没有影响。 – beroe

回答

2

使用环视断言:

>>> 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 
1

你甚至都不需要环视(除非你想捕捉不含空格的米),但你的第二个例子是英寸。这是多余的空格(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'] 
+1

或者使用['re.VERBOSE'](http://docs.python.org/3.3/library/re.html#re.X),你可以放入空格。这对于复杂的正则表达式通常很有用 - 对于新手来说,几乎所有的正则表达式都可能很复杂。 – abarnert

1

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”)
相关问题