我有以下字符串:
res = '(321, 3)-(m-5, 5) -(31,1)'我想删除括号中的空格,但我对正则表达式一无所知。
我试过了,但这不起作用:
import re
res = re.sub(r'\(.*\s+\)', '', res)发布于 2015-12-04 12:47:28
您可以使用一个函数来替换括号中的字符,用一个非贪婪的通配符匹配来分割空格上的匹配并重新加入它。
>>> 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)'发布于 2015-12-04 12:46:34
我认为正则表达式不够强大,无法在这里做您想做的事情;您需要删除括号字符之间的所有空格。问题是,在一般情况下解决这个问题意味着您正在对字符串进行上下文敏感的匹配,而正则表达式大多是上下文敏感的,因此无法完成您的工作。有些头头和后视镜可以将匹配限制在特定的上下文中,但它们在一般情况下也不能解决您的问题:
包含的模式只能匹配某些固定长度的字符串,这意味着允许
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)'发布于 2015-12-04 12:53:30
您可以将字符串转换为列表,遍历每个字母,并计算是否在括号内。在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)https://stackoverflow.com/questions/34088489
复制相似问题