Python 匹配字符(如果不在括号之间)
给定字符串Python 匹配字符(如果不在括号之间),python,regex,python-3.x,Python,Regex,Python 3.x,给定字符串 apple bottom cotton dog (eagle fox gut) horse 我想匹配每个空格字符,除了括号之间的空格字符。在上面的示例中,这将是除“fox”之前和之后之外的所有空格 我试过了 \(.*\)|( +) 这让我在第一组中找到了我想要的匹配项,但是完整匹配项包括插入字符串。我正在尝试使用pythons正则表达式拆分方法在这些空间上进行拆分,这似乎不支持在单个组上进行拆分。尝试以下操作:([](?![^(]*\))(在此处尝试:) 解释: 捕获所有: [
apple bottom cotton dog (eagle fox gut) horse
我想匹配每个空格字符,除了括号之间的空格字符。在上面的示例中,这将是除“fox”之前和之后之外的所有空格
我试过了
\(.*\)|( +)
这让我在第一组中找到了我想要的匹配项,但是完整匹配项包括插入字符串。我正在尝试使用pythons正则表达式拆分方法在这些空间上进行拆分,这似乎不支持在单个组上进行拆分。尝试以下操作:
([](?![^(]*\))
(在此处尝试:)
解释:
捕获所有:
-匹配单个空格字符。character类是不必要的,但它使空间显式,因为它位于模式的开头,可能看起来是无意的[]
消极前瞻;声明空格((?![^(]*\)
)后面没有以下内容:[]
匹配任何数量的非[^(]*
(
匹配单个\)
)
(?:\(.*\))|( +)
具有文本功能:
c = "apple bottom cotton dog (eagle fox gut) horse"
txtfilter = c[:]+"()"
result = []
while "(" in txtfilter:
positionInit = txtfilter.find("(")
extract_first = txtfilter[:positionInit]
result.extend(extract_first.split())
positionEnd = txtfilter[positionInit:].find(")")+positionInit+1
result.append(txtfilter[positionInit:positionEnd])
txtfilter = txtfilter[positionEnd:]
print result[:-1]
输出:
[“苹果”,“底部”,“棉花”,“狗”,“鹰-狐肠”,“马”]
说明:
苹果底棉狗
(鹰狐内脏)
()
马
非正则表达式的解决方案。这只适用于包含一组
()
的句子。您可以做的是从左到s.index(“(”)
,然后从右,反转到s.index”)
。它将称为x
和y
的外部部分断开。然后,为了抓取(eagle-fox-gut)
,您从这些索引中创建了一个片段,除了右端的一个额外片段,因为它不包含在内。在我们组合x.split()
之后,第一部分单词的列表作为项目,y[:-1]。split()
,与y
相同,但我们必须将其反向,并且[z]
。这只适用于这种特殊情况,任何更多的()
集都无法正确使用.index()
s = 'apple bottom cotton dog (eagle fox gut) horse'
x = s[: s.index(' (')]
y = s[: s.index(')'):-1]
z = s[s.index('('): s.index(')')+1]
res = x.split() + y[::-1].split() + [z]
print(res)
# ['apple', 'bottom', 'cotton', 'dog', 'horse', '(eagle fox gut)']
您的目标只是将空格放入列表中吗?或者获取他们的索引,等等?这是将每个单词分成一个列表,如下所示:[苹果,底部,棉花,狗,(鹰狐内脏),马]它也必须是正则表达式?它不需要是正则表达式解决方案。我认为正则表达式是最合乎逻辑的解决方案。我喜欢这个解决方案,但是这个句子可能没有或更多的附加语句。糟糕的是,我应该在问题中澄清这一点:python的re.split行为不仅返回单词“apple”、“bottom”、“cotton”等,还返回它们之间的空格?或者这与这个正则表达式有关