首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何去掉括号内的空格?

如何去掉括号内的空格?
EN

Stack Overflow用户
提问于 2015-12-04 12:31:19
回答 3查看 3.3K关注 0票数 1

我有以下字符串:

代码语言:javascript
复制
res = '(321, 3)-(m-5, 5) -(31,1)'

我想删除括号中的空格,但我对正则表达式一无所知。

我试过了,但这不起作用:

代码语言:javascript
复制
import re
res = re.sub(r'\(.*\s+\)', '', res)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-04 12:47:28

您可以使用一个函数来替换括号中的字符,用一个非贪婪的通配符匹配来分割空格上的匹配并重新加入它。

代码语言:javascript
复制
>>> 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)'
票数 3
EN

Stack Overflow用户

发布于 2015-12-04 12:46:34

我认为正则表达式不够强大,无法在这里做您想做的事情;您需要删除括号字符之间的所有空格。问题是,在一般情况下解决这个问题意味着您正在对字符串进行上下文敏感的匹配,而正则表达式大多是上下文敏感的,因此无法完成您的工作。有些头头和后视镜可以将匹配限制在特定的上下文中,但它们在一般情况下也不能解决您的问题:

包含的模式只能匹配某些固定长度的字符串,这意味着允许abca|b,但a*a{3,4}不允许。即使组引用与某些固定长度的字符串匹配,也不支持它们。

因此,我将首先匹配括号组:

代码语言:javascript
复制
>>> re.split(r'(\([^)]*\))', res)
['', '(321, 3)', '-', '(m-5, 5)', ' -', '(31,1)', '']

然后,在join将所有内容返回到单个字符串之前,第二步从它们中删除空白:

代码语言:javascript
复制
>>> 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)'
票数 0
EN

Stack Overflow用户

发布于 2015-12-04 12:53:30

您可以将字符串转换为列表,遍历每个字母,并计算是否在括号内。在toRemove中,收集空白空间的位置,然后将其从列表中删除。然后你把列表转换成字符串..。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34088489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档