【问题标题】:Python regular expression to remove all square brackets and their contentsPython正则表达式删除所有方括号及其内容
【发布时间】:2017-02-19 06:45:48
【问题描述】:

我正在尝试使用此正则表达式从字符串中删除方括号的所有实例(以及其中的所有内容)。例如,这在字符串中只有一对方括号时有效:

import re
pattern = r'\[[^()]*\]'
s = """Issachar is a rawboned[a] donkey lying down among the sheep pens."""
t = re.sub(pattern, '', s)
print t

我得到的是正确的:

>>>Issachar is a rawboned donkey lying down among the sheep pens.

但是,如果我的字符串包含一组以上的方括号,它就不起作用。例如:

s = """Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]"""

我明白了:

>>>Issachar is a rawboned

无论字符串中有多少个方括号,我都需要正则表达式才能工作。正确答案应该是:

>>>Issachar is a rawboned donkey lying down among the sheep pens.

我研究并尝试了许多排列都无济于事。

【问题讨论】:

  • 请注意,虽然正则表达式可以帮助您串联匹配括号(如 a[b]c[d]e),但它们通常无法处理所谓的nested parens problem。 (例如:a[b[c][d[e]]]。)不过,您可以通过专门编码一些最大嵌套数来“伪造”它。

标签: python regex


【解决方案1】:

默认情况下*(或+)会贪婪匹配,因此问题中给出的模式将匹配到最后一个]

>>> re.findall(r'\[[^()]*\]', "Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]")
['[a] donkey lying down among the sheep pens.[b]']

通过在重复运算符(*)后附加?,可以使其匹配非贪婪方式。

>>> import re
>>> pattern = r'\[.*?\]'
>>> s = """Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]"""
>>> re.sub(pattern, '', s)
'Issachar is a rawboned donkey lying down among the sheep pens.'

【讨论】:

  • 括号内的数字呢?例如,text =“这是关于数字[30]。你的地址在哪里?[90]”。就像在维基百科文本文档中一样。
  • 好的,我知道了 >> "[\d*]"
  • @NeihPaine330\[\d+\].
【解决方案2】:

试试:

import re
pattern = r'\[[^\]]*\]'
s = """Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]"""
t = re.sub(pattern, '', s)
print t

输出:

Issachar is a rawboned donkey lying down among the sheep pens.

【讨论】:

    【解决方案3】:

    对于括号内的数字(无字母),例如[89]、[23]、[11] 等, 这是要使用的模式。

    import re
    
    text = "The[TEXT] rain in[33] Spain[TEXT] falls[12] mainly in[23] the plain![45]"
    pattern = "\[\d*?\]"
    numBrackets = re.findall(pattern, text)
    
    print(numBrackets)
    

    输出:

    ['[33]', '[12]', '[23]', '[45]']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多