python - 我们如何使用 python 正则表达式解析文本?
问题描述
我有以下文本,我希望以字典格式输出。
text = '''
146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622
197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0" 203 26554
156.127.178.177 - okuneva5222 [21/Jun/2019:15:45:27 -0700] "DELETE /interactive/transparent/niches/revolutionize HTTP/1.1" 416 14701
100.32.205.59 - ortiz8891 [21/Jun/2019:15:45:28 -0700] "PATCH /architectures HTTP/1.0" 204 6048
'''
我尝试了以下方法,但能够获得 2 个字典,而我希望返回 4 个。
names = []
for item in re.finditer("(?P<host>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s-\s(?P<user_name>[a-zA-Z0-9]+)\s\[(?P<time>\d{2}\/[a-zA-Z]+\/[0-9]+\:[0-9]+\:[0-9]+\:[0-9]+\s-\d{4})\]\s\"(?P<request>[a-zA-Z]+\s\/[a-zA-Z]+\s[a-zA-Z]+\/\d{1}\.\d{1})\"", text):
item.groupdict()
names.append(item.groupdict())
print(names)
任何人都可以帮助我吗?
解决方案
您尝试匹配的字符串的这一部分:
"DELETE /virtual/solutions/target/web+services HTTP/2.0"
与您的正则表达式不匹配,因为它希望后面DELETE /
的所有内容都是字母。匹配的请求是:
POST /incentivize HTTP/1.1
PATCH /architectures HTTP/1.0
而那些不是
DELETE /virtual/solutions/target/web+services HTTP/2.0
DELETE /interactive/transparent/niches/revolutionize HTTP/1.1
更改request
正则表达式的一部分以识别/
和+
除了字母字符:
"[a-zA-Z]+\s\/[a-zA-Z/+]+\s[a-zA-Z]+\/\d{1}\.\d{1}\"
↑↑
代替
"[a-zA-Z]+\s\/[a-zA-Z]+\s[a-zA-Z]+\/\d{1}\.\d{1}\"
推荐阅读
- python - Python 将 np.array 变成一个列表
- angular - Angular 导入模块的奇怪行为
- python - Python asyncio:未来与任务
- vue.js - Vue 中大型交错列表的速度动画
- python - 展开 NumPy 索引选择
- mysql - 如何使用交叉连接查找行>列组合?[SQL]
- python - 如何将 VB 委托转换为 python 事件处理程序?
- node.js - 如何避免heroku上的请求超时?
- r - 如何在 ggplots 条形图中对 2 个类别进行排序并按降序对它们进行排序?
- java - Java Dropbox HttpServletRequest ( java.lang.UnsupportedOperationException: 尚不支持。)