如何在正则表达式中匹配除两个或多个连续空格之外的任何内容?
我有一个像
这样的测试字符串string = ' a title of foo b '
我想从字符串中捕获title of foo
。基本上,这意味着我们从任意数量的空格开始,然后是字母和空格的组合,但是从不超过一个连续的空格,然后再用任意数量的空格。
尝试(在python中)。
string = ' title of foo '
match = re.match('\s*([^\s{2,}])*\s*', string)
这不起作用,因为方括号需要一个列表,我想。
答案 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
答案 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)+)/
您可以使用该页面左侧的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]