【问题标题】:Python Regex removing space inside bracketsPython 正则表达式删除括号内的空格
【发布时间】:2020-08-04 12:56:06
【问题描述】:

我正在尝试删除方括号内字符周围的空格,如果下一个标记是非空白字符,则在方括号外只留下 1 个空格。例如,
banana [ pasta pause] [12 haha] [author bird] tree [red] abc [blue] 将是

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)

【问题讨论】:

  • 如果你有[inside] out side [inside]怎么办?
  • @rici 应该是[inside]out side[inside]

标签: python regex parsing


【解决方案1】:

请注意,您的预期输出包含 tree 和 abc 之前仅的空格,但所有其他空格(例如,banana em> 在] 和[ 之间) 消失了。

这表明你确实想要:

  1. 删除所有括号之间的空格。

  2. 删除所有剩余空格(括号外),除非有字母 在它之后(不是非空白字符)。

另请注意,您的文本包含“配对”括号,即在 [ 之后(和 许多非括号字符)出现],但没有出现另一个[(我想 使用此功能)。

定位上述两种情况的模式是:

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))

【讨论】:

  • Lookaround 是我想要的,但对它了解不多。这使它更容易谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多