我想构建一个捕获的正则表达式
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(" ")
进一步拆分它以将其分成两个空格分开的子组,但那么三空格的情况又如何呢?那么?
答案 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']
它也没有选择你的标点符号,这可能是一个问题。
总的来说,我认为正则表达式是正确的答案,但如果它能满足您的所有需求,那么使用和维护起来就会更加简单。