【问题标题】:Split by \b when your regex engine doesn't support it当您的正则表达式引擎不支持时,由 \b 分割
【发布时间】:2010-09-28 18:04:24
【问题描述】:

如何在不支持它的正则表达式引擎中按字边界分割?

python 的 re 可以匹配 \b 但似乎不支持对其进行拆分。我似乎记得处理过具有相同限制的其他正则表达式引擎。

示例输入:

"hello, foo"

预期输出:

['hello', ', ', 'foo']

实际python输出:

>>> re.compile(r'\b').split('hello, foo')
['hello, foo']

【问题讨论】:

标签: python regex


【解决方案1】:

也可以为此使用 re.findall():

>>> re.findall(r'.+?\b', 'hello, foo')
['hello', ', ', 'foo']

【讨论】:

  • re.findall(r'.+?\b', 'hello, foo!') 给出 ['hello', ', ', 'foo'],缺少最后的 '!'
【解决方案2】:

有趣。到目前为止,我尝试过的大多数 RE 引擎都进行了这种拆分。

我玩了一下,发现 re.compile(r'(\W+)').split('hello, foo') 给出了您期望的输出...不过不确定这是否可靠。

【讨论】:

    【解决方案3】:

    好的,我想通了:

    将拆分模式放入捕获括号中,并将包含在输出中。您可以使用 \w+ 或 \W+:

    >>> re.compile(r'(\w+)').split('hello, foo')
    ['', 'hello', ', ', 'foo', '']
    

    要摆脱空结果,请将其通过 filter() 并使用 None 作为过滤器函数,它将过滤任何不评估为 true 的内容:

    >>> filter(None, re.compile(r'(\w+)').split('hello, foo'))
    ['hello', ', ', 'foo']
    

    编辑:CMS 指出如果你使用 \W+ 你不需要使用 filter()

    【讨论】:

    • 如果您的字符串以非单词符号开头或结尾,您仍然需要过滤器
    【解决方案4】:

    (\W+) 可以给你预期的输出:

    >>> re.compile(r'(\W+)').split('hello, foo')
    ['hello', ', ', 'foo']
    

    【讨论】:

    • 因为它拆分了非单词字符,(在这种情况下是空格和逗号...),并且pattern中使用了捕获括号,所以pattern中的组的文本也是作为结果列表的一部分返回。
    • @CMS:您可能想在正则表达式中提及 re.U 标志或“(?u)”前缀的选项,因为我们生活在一个多语言世界。
    • re.split(r'(\W+)', '* hello, foo!') 给出 ['', '* ', 'hello', ', ', 'foo', ' !', ''],所以你可能需要处理初始和最终的空字符串
    【解决方案5】:

    试试

    >>> re.compile(r'\W\b').split('hello, foo')
    ['hello,', 'foo']
    

    这在边界之前的非单词处分裂。 您的示例没有什么可拆分的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2021-03-12
      相关资源
      最近更新 更多