我正在尝试在字符串中查找一些非常具体的数据。问题是我没有找到我正在使用的当前正则表达式的所有数据。以下是一些示例数据:
[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)
显然我的正则表达式出了问题,但是在把头撞到墙上之后我无法理清,所以任何帮助都会受到赞赏。感谢。
答案 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
个字符放在方括号中,该字符将匹配包含字符1
,2
,d
,f
或{{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]+\]