Python:从列表中删除/过滤等号

时间:2017-03-19 20:53:05

标签: python list substring

快速提问,因为我被困住了,似乎无法再深入了解。

这是我的问题:

我在数据集中工作,我从XML转储中提取维基百科页面的每个部分名称。我提取文本,从文本中,每个部分都通过以下方式给出:

==部分名称==

但是,还有一些我不想处理的小节,通过

给出

===部分名称===

目前我正在使用正则表达式来过滤文本中的部分(pagetext)

sections = re.findall("==(.*)==", pagetext)

然而,结果是小节也包含在我的部分列表中。问题:如何从我的部分列表中过滤这些子部分,以便仅从文本中检索部分。

我已经使用了这个列表理解,但这不起作用

sections = [section for section in sections if section[0] == (r"^=")]

非常感谢任何帮助:)非常感谢提前!!

2 个答案:

答案 0 :(得分:2)

如果周围的文字完全是任意的,您可能不得不诉诸negative lookahead and negative lookbehind

re.findall(r'(?<!=)==(?!=)(.*?)(?<!=)==(?!=)', pagetext)
# (?<!...) only matches if not preceded by ...
# (?!...) only matches if not followed by ...
# (.*?) the captured group itself, anything matched non-greedily

这可确保封闭'=='的部分既不在'='之前也不在其后面。

答案 1 :(得分:0)

  1. 启用多行标记re.M,以便表达式可以锚定在行的开头。
  2. 将表达式锚定在每行的开头。
  3. 排除第三个等号
  4. ,排除原始正则表达式中的子部分

    例如

    sections = re.findall("^==([^=].*)==", pagetext, re.M)