如何在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种情况:
- 的“m”之前和之后的空白
- 在开头“M”后跟空格
- “M”在端部由白色空间之前
- ' m',而在它之前或之后没有任何内容(即,只是字面意思是字符串“m”)
以上是 如何在python中使用正则表达式分隔单词,同时考虑带撇号的单词? 的全部内容, 来源链接: utcz.com/qa/262272.html