正则表达式求教

S_Slan 2018-08-08 08:31:42
这是一段html
text的内容:
<tr>
<td align="center" name="sn" >2018001</td>
<td align="center" name="name" >张三</td>
<td align="center" name="gender" >女</td>
<td align="center" name="age" >20</td>
<td align="center" name="nation" >汉族</td>
<td align="center" name="score" >560</td>
</tr>
<tr>
<td align="center" name="sn" >2018002</td>
<td align="center" name="name" >李四</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >21</td>
<td align="center" name="nation" >维吾尔族</td>
<td align="center" name="score" >600</td>
</tr>
<tr>
<td align="center" name="sn" >2018003</td>
<td align="center" name="name" >王麻子</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >23</td>
<td align="center" name="nation" >回族</td>
<td align="center" name="score" >669</td>
</tr>
<tr>
<td align="center" name="sn" >2018004</td>
<td align="center" name="name" >李雷</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >20</td>
<td align="center" name="nation" >汉族</td>
<td align="center" name="score" >580</td>
</tr>

用<tr>(.*?)</tr> 提取tr之间的内容

patten=r'<tr>(.*?)</tr>'
regex=re.compile(patten)
text=regex.findall(content,re.S|re.M)

返回的结果是空的
把patten=r'<tr>(.*?)</tr>'改为patten=r'<tr>([\s\S]*?)</tr>' 就可以取到数据
.*?和[\s\S]*?有什么区别。为什么会这样?
...全文
135 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
欢乐的小猪 2018-08-08
  • 打赏
  • 举报
回复
import re

content = '''
<tr>
<td align="center" name="sn" >2018001</td>
<td align="center" name="name" >张三</td>
<td align="center" name="gender" >女</td>
<td align="center" name="age" >20</td>
<td align="center" name="nation" >汉族</td>
<td align="center" name="score" >560</td>
</tr>
<tr>
<td align="center" name="sn" >2018002</td>
<td align="center" name="name" >李四</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >21</td>
<td align="center" name="nation" >维吾尔族</td>
<td align="center" name="score" >600</td>
</tr>
<tr>
<td align="center" name="sn" >2018003</td>
<td align="center" name="name" >王麻子</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >23</td>
<td align="center" name="nation" >回族</td>
<td align="center" name="score" >669</td>
</tr>
<tr>
<td align="center" name="sn" >2018004</td>
<td align="center" name="name" >李雷</td>
<td align="center" name="gender" >男</td>
<td align="center" name="age" >20</td>
<td align="center" name="nation" >汉族</td>
<td align="center" name="score" >580</td>
</tr>
'''
patten = r'<tr>(.*?)</tr>'
regex = re.compile(patten, re.S)
text = regex.findall(content)
for tr in text:
print('-----------------------------------------------')
print(tr)
S_Slan 2018-08-08
  • 打赏
  • 举报
回复

patten=r'<tr>(.*?)</tr>'
regex=re.compile(patten)
text=regex.findall(content,re.S|re.M)

这个re.compile()没有设定flags的值,所以"."不能匹配\n。而之后的regex.findall() 方法,我用错了。应该把re.S|re.M放到re.compile()里面。

patten=r'<tr>(.*?)</tr>'
regex=re.compile(patten,re.S|re.M)
text=regex.findall(content)
wudamen 2018-08-08
  • 打赏
  • 举报
回复
[quote=引用 4 楼 S_Slan 的回复:]
你试一下这样子

import re
com = re.compile(r'<tr>(.*?)</tr>', re.S)
data = re.findall(com, text)
print(data)
S_Slan 2018-08-08
  • 打赏
  • 举报
回复
重新看了一下re的源码,上面代码的两个findall是两个不同的方法
S_Slan 2018-08-08
  • 打赏
  • 举报
回复
我刚才试了一下,按你的来写

data=re.findall(r'<tr>(.*?)</tr>',content,re.S)

data有数据。
而这样写

patten=r'<tr>(.*?)</tr>'
regex=re.compile(patten)
data=regex.findall(content,re.S)

data里什么都没有

S_Slan 2018-08-08
  • 打赏
  • 举报
回复
引用 1 楼 wudamen 的回复:
( .*? ) . 可以匹配除了空白符之外的所有字符,而\s --> 匹配空白字符 \S --> 匹配非空白字符 所以能匹配到
如果 . 想匹配到空白字符的话 第一个修饰符 为re.S


"."网上和书上都是说“匹配除换行符\n外的任意字符”。加了re.S后可任意匹配。
wudamen 2018-08-08
  • 打赏
  • 举报
回复
( .*? ) . 可以匹配除了空白符之外的所有字符,而\s --> 匹配空白字符 \S --> 匹配非空白字符 所以能匹配到
如果 . 想匹配到空白字符的话 第一个修饰符 为re.S

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧