【问题标题】:Split string by multiple separators? [duplicate]用多个分隔符分割字符串? [复制]
【发布时间】:2012-05-12 15:28:18
【问题描述】:

可能重复:
Python: Split string with multiple delimiters

我可以在 Python 中做类似的事情吗?

VB.net 中的拆分方法:

Dim line As String = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx"
Dim separators() As String = {"Tech ID:", "Name:", "Account #:"}
Dim result() As String
result = line.Split(separators, StringSplitOptions.RemoveEmptyEntries)

【问题讨论】:

    标签: python


    【解决方案1】:

    鉴于这种糟糕的数据格式,您可以尝试re.split()

    >>> import re
    >>> mystring = "Field 1: Data 1 Field 2: Data 2 Field 3: Data 3"
    >>> a = re.split(r"(Field 1:|Field 2:|Field 3:)",mystring)
    ['', 'Field 1:', ' Data 1 ', 'Field 2:', ' Data 2 ', 'Field 3:', ' Data 3']
    

    如果数据格式合理,使用带引号的字符串和逗号分隔的记录,您的工作会容易得多。这将允许使用csv 模块来解析逗号分隔值文件。

    编辑:

    您可以使用列表推导过滤掉空白条目。

    >>> a_non_empty = [s for s in a if s]
    >>> a_non_empty
    ['Field 1:', ' Data 1 ', 'Field 2:', ' Data 2 ', 'Field 3:', ' Data 3']
    

    【讨论】:

    • 谢谢!我知道数据格式。不幸的是,我正在尝试将 PITA pdf 转换为 csv。
    • 您能详细说明一下吗?我很新,看不懂你的代码。
    【解决方案2】:
    >>> import re
    >>> str = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx"
    >>> re.split("Tech ID:|Name:|Account #:",str)
    ['', ' xxxxxxxxxx ', ' DOE, JOHN ', ' xxxxxxxx']
    

    【讨论】:

    • 为什么split 标记本身不出现在您的输出中? Python 2 与 Python 3 的区别?
    • 这是个好问题。我没听懂。
    • @Li-aungYip: :) 不是真的,与 Python 版本无关。只是我没有将模式包含在(...) 中,因此它们没有被捕获。
    • 一件小事,你可能不想调用你的变量str,因为它是一个builtin的名字
    • 啊,我傻了。我没有意识到拆分模式实际上允许捕获。
    【解决方案3】:

    我会建议一种不同的方法:

    >>> import re
    >>> subject = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx"
    >>> regex = re.compile(r"(Tech ID|Name|Account #):\s*(.*?)\s*(?=Tech ID:|Name:|Account #:|$)")
    >>> dict(regex.findall(subject))
    {'Tech ID': 'xxxxxxxxxx', 'Name': 'DOE, JOHN', 'Account #': 'xxxxxxxx'}
    

    这样您就可以为此类数据获得一个有用的数据结构:字典。

    作为注释的正则表达式:

    regex = re.compile(
        r"""(?x)                         # Verbose regex:
        (Tech\ ID|Name|Account\ \#)      # Match identifier
        :                                # Match a colon
        \s*                              # Match optional whitespace
        (.*?)                            # Match any number of characters, as few as possible
        \s*                              # Match optional whitespace
        (?=                              # Assert that the following can be matched:
         Tech\ ID:|Name:|Account\ \#:    # The next identifier
         |$                              # or the end of the string
        )                                # End of lookahead assertion""")
    

    【讨论】:

    • 这对我来说似乎不是一个好方法,因为您重复了标识符。
    • @jamylak:我知道,但是您还能如何判断值何时结束?如果您可以保留分隔符当然会更好,但这似乎不是一个选择。
    猜你喜欢
    • 2017-07-08
    • 2020-04-23
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多