我有以下字符串:
res = '(321, 3)-(m-5, 5) -(31,1)'
我想用括号删除空格,但我对正则表达式没有任何了解
我试过这个,但这不起作用:
import re
res = re.sub(r'\(.*\s+\)', '', res)
答案 0 :(得分:2)
您可以将括号中的字符的非贪婪的通配符匹配替换为在空格上拆分匹配并重新加入它的函数。
>>> import re
>>> res = '(321, 3)-(m-5, 5) -(31,1)'
>>> re.sub(r'\(.*?\)', lambda x: ''.join(x.group(0).split()), res)
'(321,3)-(m-5,5) -(31,1)'
答案 1 :(得分:0)
我认为正则表达式不够强大,不能在这里做你想做的事情;您想要删除括号中的所有空格。问题是,对于一般情况解决这个问题意味着你正在对字符串进行上下文敏感的匹配,而正则表达式主要是上下文不敏感的,因此无法完成你的工作。 lookaheads and lookbehinds可以限制与特定上下文的匹配,但在一般情况下它们也无法解决您的问题:
包含的模式必须仅匹配某些固定长度的字符串,这意味着允许
abc
或a|b
,但a*
和a{3,4}
不允许。>>> re.split(r'(\([^)]*\))', res) ['', '(321, 3)', '-', '(m-5, 5)', ' -', '(31,1)', '']
和join
。即使它们匹配某些固定长度的字符串,也不支持组引用。
因此,我首先匹配括号组:
>>> g = re.split(r'(\([^)]*\))', res)
>>> g[1::2] = [re.sub(r'\s*', '', x) for x in g[1::2]]
>>> ''.join(g)
'(321,3)-(m-5,5) -(31,1)'
然后在<form action="{% url 'polls:vote' instance.poll.id %}" method="post">
将所有内容备份到单个字符串之前的第二步中从中删除空格:
{{1}}
答案 2 :(得分:0)
您可以将字符串转换为列表,浏览每个字母并计算是否在括号内。在toRemove中,您将收集空格的位置,然后从列表中删除这些位置。然后将列表转换回字符串...
res = '(321, 3)-(m-5, 5) -(31,1)'
r = list(res)
insideBracket = 0
toRemove = []
for pos,letter in enumerate(r):
if letter == '(':
insideBracket += 1
elif letter == ')':
insideBracket -= 1
if insideBracket > 0:
if letter == ' ':
toRemove.append(pos)
for t in toRemove[::-1]:
r.pop(t)
result = ''.join(r)
print(result)