Python正则表达式删除括号内的空格

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*?)\]"

我试图删除方括号内字符周围的空格,如果下一个标记是非空白字符,则在方括号外只保留1个空格。例如,
香蕉[面食暂停][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是我想要但不太了解的东西。这使它更容易谢谢。