1

我只是想写一个可以使用正则表达式解析一些文本并在表格中返回结果匹配的小网页。这是我第一次使用 python 进行 web 开发,不得不说,它看起来很乱。

我的问题是为什么我只获得数据集中最后一场比赛的输出?我认为这必须是因为嵌套循环的格式不正确。

这是我提供的数据:

groups 只是一个与正则表达式组相对应的 id,它的名称是为表提供标题。

模式类似于:

(\d+)\s(\S+)\s(\S+)$

和数据:

12345 SOME USER
09876 SOMEONE ELSE
54678 ANOTHER USER

我的简单页面:

<%
import re
pattern = form['pattern']
p = re.compile(pattern)
data = form['data']

matches = p.finditer(data)

lines = form['groups'].split("\n")
groupids ={}
for line in lines:
  key, val = line.split(' ')
  groupids[int(key.strip())] = val.strip()

%>
<html>
<table style="border-width:1px;border-style:solid;width:60%;">
<tr>
<%
for k,v in groupids.iteritems():%>
<th style="width:30px;text-align:center"><%= v %></th>
<%
# end
%>
</tr>
<%
for match in matches:
  #begin
%><tr>
<%
for i in range(1, len(match.groups())+1):
  #begin
%>
  <td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= match.group(i) %></td>
<%
  #end
# end
%>
</tr>

</table>
</html>

编辑

下面是我跑的测试

代码:

import re
pattern = "(\d\d\d\d\d)\s(\S+)\s(\S+)"

p = re.compile(pattern)

data = """12345 TESTS USERS
34567 TESTS USERS
56789 TESTS USERS"""

groups = """1 PIN
2 FNAME
3 LNAME"""

matches = p.finditer(data)

lines = groups.split("\n")

print lines
groupids ={}
for line in lines:
  key, val = line.split(' ')
  groupids[int(key.strip())] = val.strip()


for k,v in groupids.iteritems():
  print "%s\t" % v,
print ''

for match in matches:
  for i in range(1, len(match.groups())+1):
    print "%s\t" % match.group(i),
  print ''

输出:

PIN     FNAME   LNAME
12345   TESTS   USERS
34567   TESTS   USERS
56789   TESTS   USERS
4

2 回答 2

1
<%
for match in matches:
  #begin
%><tr>
<%
for i in range(1, len(match.groups())+1):
  #begin
%>
  <td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= match.group(i) %></td>
<%
  #end
# end
%>

是的,你那里没有嵌套循环。相反,你有一个循环matches输出“<tr>\n”,然后是第二个循环range(...),它只在第一个循环完成后运行。第二个不在第一个内部,因为它没有缩进这样说。

文档中,我认为您需要说的是:

<%
for match in matches:
    # begin
%><tr><%
    for group in match.groups():
        # begin
%><td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= group %></td><%
    # end
%></tr><%
# end
%>

但我只能同意你的“混乱”评论:如果 PSP 要求你像这样折磨你的 HTML 的缩进以适应你的 Python 的结构,那真的是做错了,你应该寻找另一个不那么糟糕的模板句法。Python 有很多很多的模板语言,它们对控制结构有更合理的语法。作为一个例子,在我使用上面的那个看起来像:

<px:for item="match" in="matches"><tr>
    <px:for item="group" in="match.groups()">
        <td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;">
            <?_ group ?>
        </td>
    </px:for>
</tr></px:for>
于 2009-03-10T23:47:44.373 回答
0

我不确定与模板引擎的交互,但 python 会期望内部循环在包含循环下缩进。

尝试以这种方式格式化它,看看它是否有效。

<%
for match in matches:
    %><tr><%
    for i in range(1, len(match.groups())+1):
        %><td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= match.group(i) %></td><%
%>

或者一些这样的。以上产生“IndentationError: unindent does not match any external indentation level”所以尝试:

<%
for match in matches:
    %><tr><%
    for i in range(1, len(match.groups())+1):
        %><td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= match.group(i) %></td><%

%>

或者

<%
for match in matches:
    %><tr><%
    for i in range(1, len(match.groups())+1):
        %><td style="border-style:solid;border-width:1px;border-spacing:0px;text-align:center;"><%= match.group(i) %></td><%
pass
%>

或某种组合。您的问题在于向 python 指示循环结束的位置。为此,您必须想办法让模板引擎生成具有正确缩进的有效 python。

此外,如果您可以获取生成的代码,您可以将问题分成两半:首先修改生成的代码以找出 python 将接受什么,然后修改模板以使其生成。

于 2009-03-10T23:15:05.123 回答