Python 使用正则表达式拆分具有多个空格的字符串。

Python 使用正则表达式拆分具有多个空格的字符串。,python,regex,findall,Python,Regex,Findall,我正在尝试拆分由多个空格分隔的字符串 i、 e: 正如预期的那样,结果如下: ['abcd', 'efgh', 'a.', 'abcd', 'b', 'efgh'] 但是,我想将“a”和“abcd”归入同一组,“b”和“efgh”归入同一组。所以我想要的结果是这样的: ['abcd', 'efgh', 'a. abcd', 'b efgh'] 我目前的方法是创建两种类型的表达式。第一个处理不带空格的正则表达式,即“abcd”和“efgh”。第二种是用一个空格来处理。i、 e.

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

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

    ['abcd', 'efgh', 'a.', 'abcd', 'b', 'efgh']
但是,我想将“a”和“abcd”归入同一组,“b”和“efgh”归入同一组。所以我想要的结果是这样的:

    ['abcd', 'efgh', 'a. abcd', 'b efgh']
我目前的方法是创建两种类型的表达式。第一个处理不带空格的正则表达式,即“abcd”和“efgh”。第二种是用一个空格来处理。i、 e.“a.+”abcd“

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

和往常一样,任何其他方法都是受欢迎的。谢谢你抽出时间

result = [s.strip() for s in string1.split('  ') if s.strip()]

i、 e.在两个空格上拆分并从结果中删除无关空格(使用strip)。

如果要使用
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+*)
查找后跟单个空格的非空格字符,如果存在多个非空格字符,则多次查找它们,这样也可以:

>>> 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,关于标志——perl是正则表达式的核心,在perl高级正则表达式中,用户通过默认情况下始终指定“xms”标志来关闭正则表达式的“坏”方面。这就像python中的r“”约定——您只是作为一种反射来做。它是否真正影响当前的正则表达式并不重要。对于正则表达式来说,维护也是一个考虑因素,如果您总是添加r“”和/xms,那么无论正则表达式中包含什么,它的行为都是相同的。
>>> string1 = "abcd    efgh   a. abcd   b efgh ijkl"
>>> print re.split(r"\s{2,}", string1)
['abcd', 'efgh', 'a. abcd', 'b efgh ijkl']