python正则表达式匹配,findall或搜索不返回值

时间:2012-01-07 15:25:01

标签: python regex

我正在尝试从字符串中找到一个令牌并将其返回。我在其他字符串上使用此方法,它工作正常,但这似乎没有返回任何结果。不是为了findall而不是为了搜索。

pattern= re.compile(r'<input class="token"  value="(.+?)" name="csrftoken_reply">')
    matches = pattern.findall(htmlstring)
    for match in matches:
        print match

每个响应字符串中只有一个值。虽然我没有得到“打印匹配”的结果

我也尝试过使用re.search但是同样的事情发生了,返回了一个NoneType对象......

更多信息:

这是我正在解析的html的一部分:

<form id="threadReplyForm" class="clearfix" method="post" action="/go/messages/private/threadID=0551796">
<input class="csrftoken" type="hidden" value="a7b161b7" name="csrftoken_reply">
<input type="hidden" value="reply" name="action">
<div class="editorWrapper">
<div id="premiumSmiliesNotAllowed" class="warning" style="display: none;">
<div id="editor_13" class="clearfix editor" mode="full">
<ul id="editorToolbar_13" class="editorToolbar clearfix">
<textarea id="messageInput" class="autogrow" cols="20" rows="8" name="message"></textarea>
<div id="previewDiv" class="previewArea" style="display: none;"></div>
</div>
<script>
</div>
<script>
<span class="loadingIndicator right loadingIndicatorMessage">
<p class="clearfix">
</form>

解析它:

pattern= re.compile(r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">')
    matches = pattern.findall(str(response.read()))
    for match in matches:
        print match

尝试将a7b161b7作为输出

3 个答案:

答案 0 :(得分:1)

您必须举例说明您要解析的字符串,因为这对我有用。

import re

htmlstring = """
<input class="token"  value="foo" name="csrftoken_reply">
"""

pattern= re.compile(r'<input class="token"  value="(.+?)" name="csrftoken_reply">')
matches = pattern.findall(htmlstring)
for match in matches:
    print match

除此之外,您是否考虑使用专为此类设计的库?在解析html时,正则表达式可能会非常脆弱。 Beautiful Soup似乎是这项工作的热门工具。

更新

你有一个错误的类值,一个额外的空间,你忘了'input type =“hidden”'。这里有些接近,但我仍然不鼓励使用正则表达式:

r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">'

这也有效(我假设有一个'csrftoken_reply'元素):

r'value="(.+?)" name="csrftoken_reply">'

这些都有助于我获得你想要的价值。

答案 1 :(得分:0)

不是Python人,也不建议使用正则表达式来解析html,但它可能是
可以通过这种方式得到无序的att-val数据。只需加入一些对 需要对标签进行限定。它不一定是全部或任何顺序。

修饰符:扩展的单行字符串,全局 价值捕获组是5美元

修改
(?= (?:".*?"|\'.*?\'|[^>]*?)+更改为(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*?,因为此形式的延迟量词将被强制超出标记边界以满足前瞻。新的子表达式处理attr="so< m >e"嵌入式标记,没有溢出。

<input 
  (?=\s) 
  (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) class \s*=\s* ([\'"]) \s* csrftoken \s*\1 )
  (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) name  \s*=\s* ([\'"]) \s* csrftoken_reply \s*\2 )
  (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) type  \s*=\s* ([\'"]) \s* hidden \s*\3 )
  (?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) value \s*=\s* ([\'"]) \s* (.*?)  \s*\4 )
  \s+ (?:".*?"|\'.*?\'|[^>]*?)+ (?<!/)
>

所有警告都适用,可以隐藏在嵌入式代码中,可以是评论等等 需要额外的正则表达式逻辑。

答案 2 :(得分:0)

很抱歉,2011年使用正则表达式解析HTML是临界疯狂:)为此任务优化的库数量非常大,最好的是上面提到的BeautifulSoup和lxml;我可以理解你不想处理lxml因为它的依赖列表和凌乱的安装,但BeautifulSoup是一个文件,会让你的代码更加健壮。

TL; DR:你正在重新发明轮子。