Python re.findall正则表达式问题

时间:2012-03-03 18:01:57

标签: python regex

我正在尝试在字符串中查找一些非常具体的数据。问题是我没有找到我正在使用的当前正则表达式的所有数据。以下是一些示例数据:

[img:2gcfa9cc]http://img823.imageshack.us/img823/3295/pokaijumonlogo.jpg[/img:2gcfa9cc]

Making these little guys into Kaiju monsters.  Again, I know nothing about them, other then which ones I thought would make for cool possible Kaiju (of the original 150) so here's Day 01

[b:2gcfa9cc][size=150:2gcfa9cc]BULBASAUR[/size:2gcfa9cc][/b:2gcfa9cc]
[i:2gcfa9cc]Feb 01[/i:2gcfa9cc]
[ddf2k12:2gcfa9cc]http://img853.imageshack.us/img853/2185/dailydrawfeb2012day01.jpg[/ddf2k12:2gcfa9cc]

Setting myself up with the same "parameters" as last year

I may be breaking my own Challenge rules right now but...well I started this last night and I couldn't just leave 'em out in the cold all unfinished 'n' shit.  

Obligatory Skyrim drawing.

[ddf2k12:2ytorpmj]http://4.bp.blogspot.com/-UIUSNXvnHz4/TynYf1BZ9oI/AAAAAAAAAl4/pRLHVP0Ny3U/s1600/01_cheatingcheaterwarmup1.jpg[/ddf2k12:2ytorpmj]

我想要获得的是ddf2k12标记与img标记之间的数据。到目前为止,我只处理了ddf2k12标签(我认为后者将是img而不是ddf2k12的前者),而且我应该找到的1586个标签中,我只是得到了这是我的正则表达式:

ddf2k12_regex = '(\[[ddf2k12]+\:[A-Za-z0-9]+\])(.*?)(\[[ddf2k12]+\:[A-Za-z0-9]+\])'
ddf2k12_find = re.findall(ddf2k12_regex, post)

显然我的正则表达式出了问题,但是在把头撞到墙上之后我无法理清,所以任何帮助都会受到赞赏。感谢。

5 个答案:

答案 0 :(得分:3)

通过将大型正则表达式分解为部分并使用构图,您将自己做一件大事。这似乎工作正常,如何调试它更明显。

import re

start_tag =    '(\[{tagname}:[^\]]+\])'
end_tag = start_tag.replace('\[', '\[\/', 1)
content = '((?:.|\n)*?)' # The ?: indicates a non-capturing group.                                                                                             
tag = start_tag + content + end_tag

ddf_tag=tag.format(tagname='ddf2k12')

for match in re.findall(ddf_tag, post):
    print match

答案 1 :(得分:2)

两件事。首先,您错过了结束/代码中的ddf2k12

>>> ddf2k12_regex = '(\[[ddf2k12]+\:[A-Za-z0-9]+\])(.*?)(\[/[ddf2k12]+\:[A-Za-z0-9]+\])'
>>> re.findall(ddf2k12_regex, post)
[('[ddf2k12:2gcfa9cc]', 'http://img853.imageshack.us/img853/2185/dailydrawfeb2012day01.jpg', '[/ddf2k12:2gcfa9cc]')]

所以现在它有效。但是,您将ddf2k12个字符放在方括号中,该字符将匹配包含字符12df或{{1 }}。

k

所以你需要匹配确切的标签;为此,删除那些外括号:

>>> silly_s = '[dddd:a]a[/ffff:a]'
>>> re.findall(ddf2k12_regex, silly_s)
[('[dddd:a]', 'a', '[/ffff:a]')]

答案 2 :(得分:0)

这对我有用 -

post = "[the data you want to be searched for using regex]"
ddf2k12_regex = re.compile(r"\[ddf2k12(?P<data>[\n.]*?)\[/ddf2k12")
ddf2k12_find = ddf2k12_regex.findall(post)

答案 3 :(得分:0)

问题是你在不应该使用字符集。请尝试使用以下正则表达式:

pattern = r'\[ddf2k12:\w+?\](.*?)\[/ddf2k12:\w+?\]'

\ w相当于[a-zA-Z0-9 _]

请注意,可以使用DOTALL,LOCALE和UNICODE标志,或通过添加(?s),(?L)或(?)来更改\ w和点的语义,如(。*?)中所示。 ?u)到正则表达式。

答案 4 :(得分:0)

将文字分组为(sometex),而不是[sometext]。我认为ddf2k12标记可能会出现在[...]旁边。关闭+,您现在不需要(...)

\[ddf2k12:[a-zA-Z0-9]+\](.*?)\[/ddf2k12:[a-zA-Z0-9]+\]

做得很好。请注意,返回值是(.*?)中的文本。如果您想获取标记名称,可以使用(...) wrap ddf2k12。然后,带有img标记的组合版本就是这样。

\[(ddf2k12|img):[a-zA-Z0-9]+\](.*?)\[/(ddf2k12|img):[a-zA-Z0-9]+\]