Python正则表达式找到了

时间:2011-10-13 10:10:58

标签: python regex

我试图在Python 2.7.2中使用正则表达式从字符串中提取所有出现的标记词。或者简单地说,我想提取[p][/p]标签内的每一段文字。 这是我的尝试:

regex = ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(pattern, line)

打印person会产生['President [P]', '[/P]', '[P] Bill Gates [/P]']

获得的正确正则表达式是什么:['[P] Barack Obama [/P]', '[P] Bill Gates [/p]']['Barrack Obama', 'Bill Gates']

感谢。 :)

5 个答案:

答案 0 :(得分:68)

import re
regex = ur"\[P\] (.+?) \[/P\]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(regex, line)
print(person)

产量

['Barack Obama', 'Bill Gates']

正则表达式ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?"完全相同 unicode为u'[[1P].+?[/P]]+?',但难以阅读。

第一个括号内的小组[[1P]告诉re列表['[', '1', 'P']中的任何字符都应该匹配,并且类似于第二个括号内的小组[/P]]。这不是什么你想要的。所以,

  • 取下外围方括号。 (同时删除 在1前面迷路P。)
  • 要保护[P]中的文字括号,请使用a转义括号 反斜杠:\[P\]
  • 要仅返回标记内的单词,请放置分组括号 在.+?附近。

答案 1 :(得分:14)

试试这个:

   for match in re.finditer(r"\[P[^\]]*\](.*?)\[/P\]", subject):
        # match start: match.start()
        # match end (exclusive): match.end()
        # matched text: match.group()

答案 2 :(得分:4)

您的问题不是100%明确,但我假设您要查找[P][/P]标记内的每一段文字:

>>> import re
>>> line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
>>> re.findall('\[P\]\s?(.+?)\s?\[\/P\]', line)
['Barack Obama', 'Bill Gates']

答案 3 :(得分:2)

你可以用

替换你的模式
regex = ur"\[P\]([\w\s]+)\[\/P\]"

答案 4 :(得分:2)

使用此模式,

pattern = '\[P\].+?\[\/P\]'

检查here