【问题标题】:using regular expression to split string with multiple spaces.使用正则表达式将字符串拆分为多个空格。
【发布时间】:2013-09-11 23:22:11
【问题描述】:

我正在尝试拆分由多个空格分隔的字符串 即:

    string1 = "abcd    efgh   a. abcd   b efgh"
    print re.findall(r"[\w.]+") 

正如预期的那样,结果是:

    ['abcd', 'efgh', 'a.', 'abcd', 'b', 'efgh']

但是,我想将“a”分组。和“abcd”进入同一组,“b”和“efgh”进入同一组。所以我想要的结果看起来像:

    ['abcd', 'efgh', 'a. abcd', 'b efgh']

我目前的方法是创建两种类型的表达。第一个处理没有空格的正则表达式,即'abcd'和'efgh'。第二个处理具有单个空格的那些。即“一个” +'abcd'。

如果 r'[\w]+ 可以处理第一种类型,并且 r'[\w]+ [\w]+ 可以处理第二种。但我不知道如何使用 '|' 将它们组合成同一个表达式。

一如既往,欢迎任何其他方法。感谢您的宝贵时间!

【问题讨论】:

    标签: python regex findall


    【解决方案1】:
    result = [s.strip() for s in string1.split('  ') if s.strip()]
    

    即拆分 两个 空格并从结果中删除无关空格(使用条带)。

    【讨论】:

      【解决方案2】:

      如果你想使用re.findall,你可以使用这个表达式:

      >>> string1 = "abcd    efgh   a. abcd   b efgh"
      >>> print re.findall(r"\S+(?:\s\S+)*", string1)
      ['abcd', 'efgh', 'a. abcd', 'b efgh']
      

      (?:\S+(?:\s\S+)*) 找到一个非空格字符,后跟一个空格,如果存在多个非空格字符,则多次查找,所以这也有效:

      >>> string1 = "abcd    efgh   a. abcd   b efgh ijkl"
      >>> print re.findall(r"\S+(?:\s\S+)*", string1)
      ['abcd', 'efgh', 'a. abcd', 'b efgh ijkl']
      

      否则,使用多于2个空格分割就简单多了:

      >>> string1 = "abcd    efgh   a. abcd   b efgh ijkl"
      >>> print re.split(r"\s{2,}", string1)
      ['abcd', 'efgh', 'a. abcd', 'b efgh ijkl']
      

      【讨论】:

      • 为什么不只是 re.findall("\S+(?:\s\S+)*") ?此外,在这里原始字符串完全没有用,因为所有反斜杠都旨在被重新编译器解释为元字符,而不是简单的反斜杠字符。
      • @eyquem 因为re.findall() 接受 2 到 3 个参数?你试过运行re.findall("\S+(?:\s\S+)*")吗?如果我这样做,我会得到一个错误。并且使用原始字符串是一种习惯,以便在需要以其他方式解释反斜杠时避免错误。
      • 我显然忘了写第二个参数:re.findall("\S+(?:\s\S+)*",string1)
      • @eyquem,所有 python 正则表达式都应该使用原始字符串,句点。专家一直使用原始字符串作为正则表达式,因为它们已经被咬了足够多的时间才能更好地了解。初学者不使用原始字符串,因为他们不知道更好。当您看到使用原始字符串和标志“xms”的正则表达式时,这很好地表明程序员不是初学者。 Jerry- 围绕整个正则表达式的非捕获组不做任何事情。当您需要使用量词修改整个组但不需要捕获组时,使用非捕获组。
      • 嘿,Jerry,关于标志——perl 在正则表达式方面是宇宙的中心,在 perl 中,高级正则表达式用户通过始终指定默认情况下为“xms”标志。这就像 python 中的 r"" 约定——你只是作为一种反射来做。它是否真的影响当前的正则表达式并不重要。维护也是正则表达式的一个考虑因素,如果你总是添加 r"" 和 /xms,那么无论它里面有什么,正则表达式都会以相同的方式运行。
      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2022-01-20
      相关资源
      最近更新 更多