Разделение списка с помощью регулярных выражений - PullRequest
1 голос
/ 23 апреля 2020

У меня возникли проблемы с попыткой разбить каждый элемент во вложенном списке. Я использовал этот метод для моего первого сплита. Я хочу сделать еще одно разделение на теперь вложенный список. Я думал, что мог бы просто использовать ту же строку кода с несколькими модификациями 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-файл с заголовком «Телефон», каждый номер выше будет в отдельной строке и не будет сгруппирован вместе. Я думаю, что мне может понадобиться изменить свой код на для l oop ???

1 Ответ

1 голос
/ 23 апреля 2020

Более чистый подход заключается в том, чтобы просто выполнить другой поиск по регулярному выражению на вашем 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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...