python - 使用正则表达式拆分列表
问题描述
我在尝试拆分嵌套列表中的每个元素时遇到了一些麻烦。我在第一次拆分时使用了这种方法。我想对现在嵌套的列表进行另一个拆分。我以为我可以简单地使用同一行代码并进行一些修改goal2 = [[j.split("") for j in goal]]
,但我仍然遇到一个常见错误:'list' object has no attribute 'split'
. 我知道您不能拆分列表,但我不明白为什么我的修改与链接方法有任何不同。这是我的第一个网络抓取项目,我正在寻找网站的电话号码。我想要一些帮助来解决我的问题,而不是新代码,以便我可以继续学习和改进我自己的方法。
import requests
import re
from bs4 import BeautifulSoup
source = requests.get('https://www.pickyourownchristmastree.org/ORxmasnw.php').text
soup = BeautifulSoup(source, 'lxml')
info = soup.findAll(text=re.compile("((?:\d{3}|\(\d{3}\))?(?:\s|-|\.)?\d{3}(?:\s|-|\.)\d{4})"))[:1]
goal = [i.split(".") for i in info]
goal2 = [[j.split("") for j in goal]]
for x in goal:
del x[2:]
for y in goal:
del y[:1]
print('info:', info)
print('goal:', goal)
无goal2
变量输出:
info: ['89426 Green Mountain Road, Astoria, OR 97103. Phone: 503-325-9720. Open: ']
goal: [[' Phone: 503-325-9720']]
goal2
带有“ ”变量的所需输出:
info: [info: ['89426 Green Mountain Road, Astoria, OR 97103. Phone: 503-325-9720. Open: ']
goal: [[' Phone: 503-325-9720']]
goal2: ['503-325-9720']
我显然会有更多的数字,但我不想堵塞空间。所以它看起来更像这样:
goal2: ['503-325-9720', '###-###-####', '###-###-####', '###-###-####']
但我想确保每个数字都可以导出到 csv 文件中的新行中。因此,当我创建一个带有标题“电话”的 csv 文件时,上面的每个数字都将位于单独的行中,而不是聚集在一起。我在想我可能需要将我的代码更改为 for 循环???
解决方案
这里更简洁的方法是在您的 上进行另一个正则表达式搜索info
,例如:
pat = re.compile(r'\d{3}\-\d{3}\-\d{4}')
goal = [pat.search(i).group() for i in info if pat.search(i)]
输出:
goal: ['503-325-9720']
或者,如果每行有多个数字:
# use captive group instead
pat = re.compile(r'(\d{3}\-\d{3}\-\d{4})')
goal = [pat.findall(i) for i in info]
输出:
goal = [['503-325-9720', '123-456-7890']]
推荐阅读
- javascript - 如何从动态表中获取下拉选择的选项
- python - 带有参数的烧瓶重定向(url_for)
- swiftui - 如何在 SwiftUI 中删除动态列表中的复杂项目?
- docker - 我无法从 rust 应用程序访问由英特尔 NUC 上的 docker 构建的 MinIO 服务器
- html - CSS 输入:焦点和边框颜色问题
- reactjs - 如何在 URL 到达 React Router 之前从 URL 末尾删除 `.html`
- oracle - Oracle 程序无法将标头写入 csv 文件
- docusignapi - Docusign 响应式签名输入字段改变流程
- php - 保存 WordPress 插件的设置页面并在前端使用变量
- java - 使用 Tom Cat Server 创建动态 Web 项目时,项目打开时出现错误