Python正则表达式删除括号内的空格
我试图删除方括号内字符周围的空格,如果下一个标记是非空白字符,则在方括号外只保留1个空格。例如,Python正则表达式删除括号内的空格,python,regex,parsing,Python,Regex,Parsing,我试图删除方括号内字符周围的空格,如果下一个标记是非空白字符,则在方括号外只保留1个空格。例如, 香蕉[面食暂停][12哈哈][作者鸟]树[红色]abc[蓝色]将是 banana[pastapause][12haha][authorbird]tree[red]abc[blue] 是否有尾随/前导空格或空格向左/向右的位置无关紧要。到目前为止,我在广场上找到了空间。这是我删除内部空格的代码: cleaned_texts = [] p = re.compile("\[(\s*?.*?\s*?)\]"
香蕉[面食暂停][12哈哈][作者鸟]树[红色]abc[蓝色]
将是banana[pastapause][12haha][authorbird]tree[red]abc[blue]
是否有尾随/前导空格或空格向左/向右的位置无关紧要。到目前为止,我在广场上找到了空间。这是我删除内部空格的代码:cleaned_texts = []
p = re.compile("\[(\s*?.*?\s*?)\]")
matches = p.findall(orig_text)
for match in matches:
cleaned = re.sub("\s","",match)
cleaned_texts.append(cleaned)
text = orig_text
for i in range(len(matches)):
cleaned = re.sub(matches[i],cleaned_texts[i],text)
text = cleaned
对于在外部添加一个空格,如果它的形式是w[]w
,w是一个非空格字符,我得到了一个非常难看的版本,它仍然有一些角盒。我不知道如何有效地做这件事
#find 2 spaces or leading and trailing space
p = re.compile("\s(\[.*?\])\s|\s(\[.*?\])$|^\s?(\[.*?\])\s?")
temp = p.sub(r"\1"," "+cleaned)
#find [] with form a[]b and add a space
p = re.compile("(\S)(\[.*?\])(\S)")
temp_2 = p.sub(r"\1\2"+" "+r"\3",temp)
#find 2 spaces or leading and trailing space one more time
p = re.compile("\s(\[[a-zA-Z-0-9]*?\])\s|^\s?(\[[a-zA-Z-0-9]*?\])\s|\s(\[[a-zA-Z-0-9]*?\])\s?$")
temp_3 = p.sub(" "+r"\1",temp_2)
请注意,您的预期输出仅包含tree和abc之前的空格,但包含所有其他空格(例如,在banana之后以及
]
和[
之间)
消失了
这表明您实际上想要:
[
(和
许多非括号字符)出现了]
,但没有另一个[
(我想
使用此功能)
定位上述两种情况的模式为:
pat1=re.compile(r'\s+(?=[^\[]*\]))
-一系列空格\s+
-后跟(正向前瞻):(?=…)
-除[^\[]*
以外的可能为空的字符序列[
-和一个右括号\]
pat2=re.compile(r'\s+(?![a-z]),re.I)
-一系列空格\s+
-后面不跟字母(负前瞻)(?![a-z])
-不区分大小写re.I
t1 = pat1.sub('', orig_text)
print('step 1:', t1)
t2 = pat2.sub('', t1)
print('step 2:', t2)
获取:
step 1: banana [pastapause] [12haha] [authorbird] tree [red] abc [blue]
step 2: banana[pastapause][12haha][authorbird] tree[red] abc[blue]
或者您可以一次完成整个转换,执行:
pat2.sub('', pat1.sub('', orig_text))
请注意,您的预期输出仅包含tree和abc之前的空格,但包含所有其他空格(例如,在banana之后以及
]
和[
之间)
消失了
这表明您实际上想要:
[
(和
许多非括号字符)出现了]
,但没有另一个[
(我想
使用此功能)
定位上述两种情况的模式为:
pat1=re.compile(r'\s+(?=[^\[]*\]))
-一系列空格\s+
-后跟(正向前瞻):(?=…)
-除[^\[]*
以外的可能为空的字符序列[
-和一个右括号\]
pat2=re.compile(r'\s+(?![a-z]),re.I)
-一系列空格\s+
-后面不跟字母(负前瞻)(?![a-z])
-不区分大小写re.I
t1 = pat1.sub('', orig_text)
print('step 1:', t1)
t2 = pat2.sub('', t1)
print('step 2:', t2)
获取:
step 1: banana [pastapause] [12haha] [authorbird] tree [red] abc [blue]
step 2: banana[pastapause][12haha][authorbird] tree[red] abc[blue]
或者您可以一次完成整个转换,执行:
pat2.sub('', pat1.sub('', orig_text))
如果你有
[inside]outside[inside]
?@rici它应该是[inside]outside[inside]
如果你有[inside]outside[inside]
?@rici它应该是[inside]outside[inside]
Lookaround是我想要但不太了解的东西。这使它更容易谢谢。Lookaround是我想要但不太了解的东西。这使它更容易谢谢。