【问题标题】:Python - regex - Splitting string before wordPython - 正则表达式 - 在单词之前拆分字符串
【发布时间】:2011-10-06 05:57:30
【问题描述】:

我正在尝试在 python 中在特定单词之前拆分字符串。例如,我想在"path:" 之前拆分以下字符串。

  • "path:"之前分割字符串
  • 输入:"path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism"
  • 输出:['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism']

我试过了

rx = re.compile("(:?[^:]+)")
rx.findall(line)

这不会在任何地方拆分字符串。问题是"path:" 之后的值永远不会知道指定整个单词。有谁知道怎么做?

【问题讨论】:

    标签: python regex string split splice


    【解决方案1】:

    您可以使用["path:"+s for s in line.split("path:")[1:]] 而不是使用正则表达式。 (请注意,我们跳过第一个匹配项,它没有“路径:”前缀。

    【讨论】:

      【解决方案2】:
      in_str = "路径:bte00250 丙氨酸、天冬氨酸和谷氨酸代谢路径:bte00330 精氨酸和脯氨酸代谢" in_list = in_str.split('路径:') 打印 ",path:".join(in_list)[1:]

      【讨论】:

        【解决方案3】:

        使用正则表达式拆分字符串似乎有点过头了:字符串split() 方法可能正是您所需要的。

        无论如何,如果你真的需要匹配一个正则表达式来分割你的字符串,你应该使用re.split()方法,它在正则表达式匹配时分割一个字符串。

        另外,使用正确的正则表达式进行拆分:

        >>> line = 'path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism'
        >>> re.split(' (?=path:)', line)
        ['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism']
        

        (?=...) 组是一个前瞻断言:表达式匹配一个空格(注意表达式开头的空格),其后跟字符串'path:',不消耗后面的内容空间。

        【讨论】:

        • 我不明白为什么正则表达式中需要空格。幸运的是,我的疑惑得到了一个很好的答案here。我怀疑有些人可能有同样的疑问,所以我在这里发布链接。
        • 为什么这不起作用? re.split(" (?=\d)", "User1")['User1']
        • @farukdgn 简单的答案是您的正则表达式与输入字符串中的任何内容都不匹配,即您正在搜索一个空格后跟一个数字,但输入字符串中没有空格。为了使您的正则表达式正常工作,您必须删除空格,但正如brandizi 在上述评论中发布的链接中所解释的那样, re.split() 不能在零长度匹配时拆分,因此您必须包含一些匹配的上下文在前瞻表达式之前。该空间在原始问题中有效,因为输入始终在字符串“路径:”之前包含一个空格。
        • 因为“.”匹配的字符在拆分中消耗。你显然不明白 re.split() 是如何工作的,请阅读documentation。此外,这与原始问题无关,如果您需要进一步指导,请在 stackoverflow 上发布一个新问题。
        • @AdrienPlisson 我发现了这个问题。您在错误的假设下回答了这个问题,即每个 path: 前面都会有一个空格(问题和答案中都没有提到),因此我没有给予这部分足够的重视。
        【解决方案4】:

        这可以在没有正则表达式的情况下完成。给定一个字符串:

        s = "path:bte00250 Alanine, aspartate ... path:bte00330 Arginine and ..."
        

        我们可以用占位符临时替换所需的单词。占位符是单个字符,我们用它来分割:

        word, placeholder = "path:", "|"
        s = s.replace(word, placeholder).split(placeholder)
        s
        # ['', 'bte00250 Alanine, aspartate ... ', 'bte00330 Arginine and ...']
        

        现在字符串被拆分了,我们可以使用列表推导将原始单词重新连接到每个子字符串:

        ["".join([word, i]) for i in s if i]
        # ['path:bte00250 Alanine, aspartate ... ', 'path:bte00330 Arginine and ...']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-24
          • 2017-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多