【问题标题】:How do I separate words using regex in python while considering words with apostrophes?在考虑带撇号的单词时,如何在 python 中使用正则表达式分隔单词?
【发布时间】:2013-10-20 07:35:02
【问题描述】:

我尝试使用单词边界在 python 正则表达式中单独的 m 并找到它们。这些 m 应该在两边都有一个空格或者开始/结束字符串:

r = re.compile("\\bm\\b")
re.findall(r, someString)

但是,此方法还可以在 I'm 之类的单词中找到 m,因为撇号被认为是单词边界。如何编写不将撇号视为单词边界的正则表达式?

我试过了:

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

但这与任何 m 都不匹配。奇怪。

【问题讨论】:

  • \\s 示例与任何m 都不匹配的原因是管道周围有额外的空间。这些包含在搜索字符串中。否则,这对我有用,无需环顾。

标签: python regex


【解决方案1】:

使用环视断言:

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

(?&lt;=...)

如果字符串中的当前位置前面有匹配项,则匹配 对于在当前位置结束的...。这被称为积极 回溯断言。 (?&lt;=abc)def 将在 abcdef 中找到匹配项,...

来自Regular expression syntax

顺便说一句,使用原始字符串 (r'this is raw string'),您无需转义 \

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

【讨论】:

    【解决方案2】:

    您甚至不需要环顾四周(除非您想捕捉没有空格的 m),但您的第二个示例距离几英寸。是额外的空格(在 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']
    

    【讨论】:

    • 或者使用re.VERBOSE,你可以把空格留在里面。这对于复杂的正则表达式通常很有用——对于新手来说,几乎任何正则表达式都可能很复杂。
    【解决方案3】:

    falsetru 的答案是几乎相当于“\b 除了撇号”,但不完全是。它仍然会找到缺少边界的匹配项。使用 falsetru 的一个例子:

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

    它找到了 'm',但在 'mama' 中没有出现匹配 '\bm\b' 的 'm'。第一个 'm' 匹配 '\bm',但已经很接近了。

    实现“不带撇号的\b”的正则表达式如下所示:

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

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

    1. 'm' 前后有空格
    2. 'm' 开头,后跟空格
    3. 'm' 以空格开头
    4. 'm' 前面或后面没有任何内容(即,只是字面上的字符串“m”)

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多