如何构建一个捕获由单个空格分隔的单词的正则表达式?

时间:2016-04-20 15:40:24

标签: python regex

我想构建一个捕获的正则表达式

Fee fie foe foo!

但是当有多个空格时:

Fee fie  foe foo!

仅捕获“费用”

我的正则表达式看起来像这样:

words_re = re.compile(r"\w[-\w .,!]*")
您可以看到的

捕获以字母数字开头的任何序列,然后是字母数字,空格和一些选定的标点符号的任意组合。我只想一次将其限制为一个空格。

或者,string.split()的变体返回分隔的空格跨度也可以为我做。

我得到的最接近的是:

words_re = re.compile(r"\w[-\w.,!]*|\s+")
l = words_re.findall(s)

但是我需要在返回的列表中搜索仅包含单空格分隔符的子列表,然后从那些重建字符串。

我有一个想法是从上面的表达式中获取结果然后用string.split(" ")进一步拆分它以将其分成两个空格分开的子组,但那么三空格的情况又如何呢?那么?

4 个答案:

答案 0 :(得分:2)

这将有效

^(\w+(?:\s[-.!\w]+)*(?:[-.!\w]*$))

<强> Regex Demo

如果你想只匹配一个空格字符串,你可以使用(这只会从开始时匹配。你可以删除锚点,如果你想捕获所有可能性)

^(\w[-.!\w]*(?:\s[-.!\w]+)*)

<强> Regex Demo

答案 1 :(得分:1)

试试

^((?:\w+(?: |[^ ]$))+)

您可以看到 live here

  • 我们首先将一个单词与\w
  • 匹配
  • 然后我们允许它后跟一个空格,或者除了空格之外的任何空格,如果它到达字符串的末尾(?: |[^ ]$)
  • 我们重复匹配后跟一个空格的每个单词或直到结束+

答案 2 :(得分:1)

不使用正则表达式的替代解决方案:

import itertools

def up_to_double_space(str):
    return " ".join(itertools.takewhile(lambda word: word, str.split(" ")))

up_to_double_space("Fee fie foe foo!")
# 'Fee fie foe foo!'
up_to_double_space("Fee fie  foe foo!")
# 'Fee fie'

答案 3 :(得分:1)

这更多的是评论而不是解决方案,但我缺乏代表,但有一个可能适合您的拆分解决方案。 split只接受一个参数,并将拆分。如果使用空格作为参数,则会在列表中插入空的sting(从两个空格之间)。缺点是其他空格(制表符等)不会导致分裂。

In [15]: x = 'fie fie  foo fum'

In [16]: x.split(' ')
Out[16]: ['fie', 'fie', '', 'foo', 'fum']

In [17]: x.split(' ')[:x.split(' ').index('')]
Out[17]: ['fie', 'fie']

它也没有选择你的标点符号,这可能是一个问题。

总的来说,我认为正则表达式是正确的答案,但如果它能满足您的所有需求,那么使用和维护起来就会更加简单。