如何在正则表达式中匹配除两个或多个连续空格之外的任何内容?

时间:2015-10-20 20:38:39

标签: python regex

如何在正则表达式中匹配除两个或多个连续空格之外的任何内容?

我有一个像

这样的测试字符串
string = ' a      title of foo        b '

我想从字符串中捕获title of foo。基本上,这意味着我们从任意数量的空格开始,然后是字母和空格的组合,但是从不超过一个连续的空格,然后再用任意数量的空格。

尝试(在python中)。

string = '      title of foo        '
match = re.match('\s*([^\s{2,}])*\s*', string)

这不起作用,因为方括号需要一个列表,我想。

5 个答案:

答案 0 :(得分:3)

使用起来会更容易:

stripped_string = string.strip()

函数strip()从字符串的开头和结尾删除空格。

答案 1 :(得分:3)

您可以使用这个基于前瞻性的正则表达式:

>>> string = ' a      title of foo        b '

>>> print re.search(r'\S+(?:(?!\s{2}).)+', string).group()
title of foo

RegEx Demo

答案 2 :(得分:1)

如果您希望匹配除 X之外的所有,它通常更容易通过X 拆分。换句话说:不是反转正则表达式,而是反转操作。

在您的情况下,只需re.split两个或更多空格,即\s{2,},并保留剩余的空格。

>>> text = '      title of foo       more text   and some more     '
>>> re.split(r'\s{2,}', text)
['', 'title of foo', 'more text', 'and some more', '']

这会在字符串的开头和结尾处产生两个额外的空匹配,但是你可以很容易地去除它们,例如:使用filter或列表理解:

>>> filter(None, re.split(r'\s{2,}', text))
['title of foo', 'more text', 'and some more']

在我看来,这比复杂的正则表达更简单,更简洁,使用大量的前瞻和东西来实际匹配 两个或更多空格的部分。

答案 3 :(得分:0)

我会选择

/(\b\w+(?: \w+\b)+)/

regex101

您可以使用该页面左侧的code generator为您提供此生成的版本:

import re
p = re.compile(ur'(\b\w+(?: \w+\b)+)')
test_str = u"string = ' a      title of foo        b '"

re.findall(p, test_str)

您的匹配将只包含title of foo,而其他任何字符串都不会在单词之间包含多个空格。

如果您不知道自己的字符是否始终为\w个字符,但可以包含除空格以外的任何字符,则可以将\w更改为\S以使其与事物匹配像

rabbit :gold: !whisker?

因为它们之间只包含一个空格。

答案 4 :(得分:0)

我认为这看起来相当干净但它确实依赖于文本两侧存在的双重空格。我更喜欢anubhava的解决方案。

string = ' a      title of foo        b '
regex=r'(?<=  )(\S.*?\S?)(?=  )'
output=re.findall(regex, string)[0]