【问题标题】:Remove text between [quote= and [/quote] in Python在 Python 中删除 [quote= 和 [/quote] 之间的文本
【发布时间】:2019-11-14 08:24:55
【问题描述】:

我正在读取一个用于应用 NLP 的 csv 文件,并且我正在尝试对数据进行预处理。我收到了来自在线论坛的数据,因此,上面有引用。如何删除它们?举个例子;

a='[b]Re:[/b] 
[quote="xxx"] How can I do that blah blah xxx [/quote]
 Hello xxx, I will tell you how you can do it blah blah blah.'

我想要下面的表格;

a='你好 xxx,我会告诉你如何做到的等等等等。'

我想要检测 [quote=" 并开始删除直到看到 [/quote] 的正则表达式。这可能吗?

我试过了,但是没用。

  def quotes(text):
   return re.sub('\[([^\]=]+)(?:=[^\]]+)?\].*?\[\/\\1\]', '', text)

  data['message'] = data['message'].apply(quotes)

【问题讨论】:

  • re.sub() 用其他东西替换它找到的模式 - 您的模式与给定的文本不匹配 - 这就是它不起作用的原因。使用regex101.com切换到python开发匹配模式。

标签: python-3.x


【解决方案1】:

这是一个似乎可行的解决方案:

a = '[b]Re:[/b] [quote="xxx"] How can I do that blah blah xxx [/quote] Hello xxx, I will tell you how you can do it blah blah blah.'
output = re.sub('\[([^\]=]+)(?:=[^\]]+)?\](.*?)\[\/\\1\]', '\\2', a)
print(output)

打印出来:

Re:  How can I do that blah blah xxx  Hello xxx, I will tell you how you can do it blah blah blah.

正则表达式模式有点冗长,但它所做的只是匹配每组标签,例如[quote="xxx"]...[/quote],删除它们,然后替换为标签内的任何内容。

\[([^\]=]+)(?:=[^\]]+)?\]  match an opening tag, and capture the tag name in \1
(.*?)                      match and capture in \2 all the content
\[\/\\1\]                  match a closing tag, using the backreference \1

请注意,re.sub 默认情况下会进行全局替换,因此一旦我们为一组标签制定了工作模式,就可以在任何地方应用它。

编辑:

如果你真的想匹配并且删除整个标签及其内容,那么使用这个:

output = re.sub('\[([^\]=]+)(?:=[^\]]+)?\].*?\[\/\\1\]', '', a)
print(output)

打印出来:

Hello xxx, I will tell you how you can do it blah blah blah.

【讨论】:

  • 感谢蒂姆的回复,它完美地处理了一个字符串。但是,我试图适应我的代码,但我做不到。我将 csv 文件读取为 data 并且我想将此正则表达式应用于“消息”列中的所有行。我已经尝试过了,但它不起作用,对于 data['message'] 中的文本:re.sub('[([^]=]+)(?:=[^]]+)?].*?[ \/\\1]', '', text) 我试过这个; data['message'] = data['message'].re.sub('[([^]=]+)(?:=[^]]+)?].*?[\/\\1] ', '',) 错误提示“AttributeError: 'Series' object has no attribute 're'”
  • 我无法解决我看不到的问题,我在这里也看不到问题。也许编辑您的问题和信息,以解释您在代码中遇到的额外复杂性。
  • 我是 stackoverflow 的新成员,我在句子末尾输入了 enter。因此我的信息丢失了。现在我已经编辑了。对不起。
  • 请阅读applying regex to a pandas dataframe。我不会编辑我的答案,因为我们现在太宽泛了。
  • 嘿蒂姆,它不起作用,因为我只是输入了错误的形式。 [b]Re:[/b] 、 [quote="xxx"] 和 Hello xxx 之间有 1 行。我编辑了问题。
【解决方案2】:

其实答案太简单了,

def quotes(text):
 return re.sub(r'\[quote.+quote\]','',text)
data['message'] = data['message'].apply(quotes)

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多