【问题标题】:python re - split a string before a characterpython re - 在字符之前拆分字符串
【发布时间】:2023-04-06 13:04:01
【问题描述】:

如何在字符前的位置拆分字符串?

  • 在'a'之前分割一个字符串
  • 输入:“fffagggahhh”
  • 输出:["fff", "aggg", "ahhh"]

明显的方法不起作用:

>>> h=re.compile("(?=a)")

>>> h.split("fffagggahhh")

['fffagggahhh']

>>>

【问题讨论】:

  • 拆分"aaa"['', 'a', 'a', 'a']['a', 'a', 'a'] 时会发生什么?
  • "aaa" -> "a", "a", "a" or "", "a", "a", "a"
  • 感谢您提供所有可行的答案!
  • -1: "aaa" -> ["a", "a", "a"] 或 ["", "a", "a", "a"]。这是我见过的最没有帮助的事情。两者都对吗?在这种情况下,任何模式都无法工作。关闭此问题。
  • Python 有什么变化吗?现在你的“显而易见的方式”完美无缺。

标签: python regex split


【解决方案1】:

好的,不完全是您想要的解决方案,但我认为这将是对问题的有用补充。

无需重新解决

没有回复:

>>> x = "fffagggahhh"
>>> k = x.split('a')
>>> j = [k[0]] + ['a'+l for l in k[1:]]
>>> j
['fff', 'aggg', 'ahhh']
>>> 

【讨论】:

  • @knitti:谢谢。我知道它不是基于 re 的解决方案,我想在编写 re 解决方案之前先写它。当我写完这篇文章时,基于 re 的解决方案来了。
  • 是的,如果你有射钉器,为什么还要用锤子敲单个钉子。
【解决方案2】:
>>> rx = re.compile("(?:a|^)[^a]*")
>>> rx.findall("fffagggahhh")
['fff', 'aggg', 'ahhh']
>>> rx.findall("aaa")
['a', 'a', 'a']
>>> rx.findall("fgh")
['fgh']
>>> rx.findall("")
['']

【讨论】:

  • -1 re.findall("(?:^|a)[^a]*", "aaa") 产生 ['', 'a', 'a']
【解决方案3】:
>>> r=re.compile("(a?[^a]+)")
>>> r.findall("fffagggahhh")
['fff', 'aggg', 'ahhh']

编辑:

这将无法正确处理字符串中的 double as:

>>> r.findall("fffagggaahhh")
['fff', 'aggg', 'ahhh']

KennyTM 的 re 似乎更适合。

【讨论】:

  • 我想知道如果空字符串以“a”开头,OP 是否希望将其保留在拆分中。
  • -1 不酷。重复 a 失败...例如“aaa” -> 空列表
【解决方案4】:
import re

def split_before(pattern,text):
    prev = 0
    for m in re.finditer(pattern,text):
        yield text[prev:m.start()]
        prev = m.start()
    yield text[prev:]


if __name__ == '__main__':
    print list(split_before("a","fffagggahhh"))

re.split 将模式视为分隔符。

>>> print list(split_before("a","afffagggahhhaab"))
['', 'afff', 'aggg', 'ahhh', 'a', 'ab']
>>> print list(split_before("a","ffaabcaaa"))
['ff', 'a', 'abc', 'a', 'a', 'a']
>>> print list(split_before("a","aaaaa"))
['', 'a', 'a', 'a', 'a', 'a']
>>> print list(split_before("a","bbbb"))
['bbbb']
>>> print list(split_before("a",""))
['']

【讨论】:

    【解决方案5】:

    这个作品重复a

      >>> re.findall("a[^a]*|^[^a]*", "aaaaa")
      ['a', 'a', 'a', 'a', 'a']
      >>> re.findall("a[^a]*|[^a]+", "ffaabcaaa")
      ['ff', 'a', 'abc', 'a', 'a', 'a']
    

    方法:您要查找的主要块是a,后跟零个或多个not-a。这涵盖了除了零个或多个 not-a 之外的所有可能性。这只能发生在输入字符串的开头。

    【讨论】:

      【解决方案6】:
      >>> foo = "abbcaaaabbbbcaaab"
      >>> bar = foo.split("c")
      >>> baz = [bar[0]] + ["c"+x for x in bar[1:]]
      >>> baz
      ['abb', 'caaaabbbb', 'caaab']
      

      由于切片的工作原理,即使在foo 中没有出现c,它也会正常工作。

      【讨论】:

        【解决方案7】:

        split() 为要分割的字符接受一个参数:

        >>> "fffagggahhh".split('a')
        ['fff', 'ggg', 'hhh']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多