【问题标题】:Python re can't split zero-width anchors? [duplicate]Python re 不能分割零宽度的锚点? [复制]
【发布时间】:2015-12-16 16:41:49
【问题描述】:
import re

s = 'PythonCookbookListOfContents'

# the first line does not work
print re.split('(?<=[a-z])(?=[A-Z])', s ) 

# second line works well
print re.sub('(?<=[a-z])(?=[A-Z])', ' ', s)

# it should be ['Python', 'Cookbook', 'List', 'Of', 'Contents']

如何使用Python re从小写字符和大写字符的边框分割字符串?

为什么第一行不行而第二行行得通?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    根据re.split

    请注意,split 永远不会在空模式匹配上拆分字符串。 例如:

    >>> re.split('x*', 'foo')
    ['foo']
    >>> re.split("(?m)^$", "foo\n\nbar\n")
    ['foo\n\nbar\n']
    

    改用re.findall 怎么样? (不要专注于分隔符,而是专注于您想要获取的项目。)

    >>> import re
    >>> s = 'PythonCookbookListOfContents'
    >>> re.findall('[A-Z][a-z]+', s)
    ['Python', 'Cookbook', 'List', 'Of', 'Contents']
    

    更新

    使用regex module替代正则表达式模块,替换re),您可以在零宽度匹配上进行拆分:

    >>> import regex
    >>> s = 'PythonCookbookListOfContents'
    >>> regex.split('(?<=[a-z])(?=[A-Z])', s, flags=regex.VERSION1)
    ['Python', 'Cookbook', 'List', 'Of', 'Contents']
    

    注意:指定regex.VERSION1 标志以启用零长度匹配行为。

    【讨论】:

    • @Booster,我相应地更新了答案。 (提regex非标准模块)
    • @Booster,请点击链接查看标准re 模块不提供的功能。
    • PyPi 正则表达式模块比re 更好。它甚至像 .NET 一样支持无限宽度的lookbehind,并保留一个捕获集合,就像在 .NET 中一样。
    • @Booster - 是的,小心你如何使用import regex,因为他们对新的构造发狂,这可能会破坏现有的其他正则表达式。
    • 我来这里是为了寻找答案,并使用re.findall 而不是re.split 为我解决了问题。谢谢!使用re.findall 的表达式更复杂,但并非完全无法管理。我也不需要额外的依赖来使用这个解决方案。
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多