Отформатируйте строку с помощью регулярного выражения, чтобы удалить пробельные символы - PullRequest
1 голос
/ 14 июня 2019

В настоящее время я пытаюсь почистить сайт для получения некоторой информации, но сталкиваюсь с некоторыми проблемами.

В настоящее время у меня есть элемент bs4.element.Tag с некоторым html и текстом в нем, и когда я делаю "variable.text", я получаю следующий текст:

\n\nUlmstead Club\n\t\t\t\t\t911 Lynch Dr\n\n\t\t\t\t\t\tArnold, Maryland\t\t\t\t\t 21012\n\t\t\t\t\tUnited States\n(410) 757-9836 \n\n Get directions\n\n Favorite court \n\n\n\nTennis Court Details\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\tLocation type:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\tClub\t\t\t\t\t\t\t\t\t\n\n\n\n\t\t\t\t\t\t\t\t\t\tMatches played here:\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t0\t\t\t\t\t\t\t\t\t\n\n\n\n\t\t\t\t\t\t\t\t\t\t

Я хочу избавиться от всех символов пробела (\n и \t), чтобы получить соответствующую информацию в списке или любой повторяемой форме.

Я уже пробовал кучу команд регулярных выражений, но одна из них, которая приблизила меня к моей цели, была: re.split('[\t\n]',variable.text), я получил следующее:

['',
 '',
 'Ulmstead Club',
 '',
 '',
 '',
 '',
 '',
 '911 Lynch Dr',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 'Arnold, Maryland',
 '',
 '',
 '',
 '',

Я отключил большую часть вывода, чтобы сэкономить место.

Я супер потерян, и любая помощь будет принята с благодарностью

Ответы [ 4 ]

1 голос
/ 14 июня 2019

Попробуйте разделить на [\t\n]+:

re.split('[\t\n]+', variable.text.strip())

Казалось бы, это сработает, поскольку устранит пустые строковые записи в выходном массиве.

0 голосов
/ 14 июня 2019

Я бы запустил 2 регулярных выражения в строке, начиная с 1, затем 2

  1. Найти \s*(?:\r?\n)\s*
    Заменить \n

https://regex101.com/r/EGTyKB/1

Найти [ ]*\t+[ ]*
Заменить \t

https://regex101.com/r/XIyi44/1

Это очищает весь пробел и превращает его в
читаемый блоктекст.

Ulmstead Club
911 Lynch Dr
Arnold, Maryland 21012
United States
(410) 757-9836
Get directions
Favorite court
Tennis Court Details
Location type:
Club
Matches played here:
0
0 голосов
/ 14 июня 2019

Вы можете использовать функцию string.replace(), чтобы избавиться от \ n и \ t, не требуя регулярного выражения для этого (я заменил \ n и \ t на 2 пробела для следующего шага):

variable.text = variable.text.replace("\n","  ")
variable.text = variable.text.replace("\t","  ")

если вы хотите затем разбить ваши данные на список, вы можете разбить их по пробелам и использовать remove() для удаления любых лишних пустых строк в списке (обратите внимание, что я неНа 100% уверенный в том, как вы хотите, чтобы ваши данные были разделены, я только что нашел решение, которое соответствовало моей логике того, как они должны быть разделены) :

result = re.split("[\s]\s+",variable.text)
while ('' in result):
    result.remove('')

Вот пример полного кода:

import re    

teststring ="\n\nUlmstead Club\n\t\t\t\t\t911 Lynch Dr\n\n\t\t\t\t\t\tArnold, Maryland\t\t\t\t\t 21012\n\t\t\t\t\tUnited States\n(410) 757-9836 \n\n Get directions\n\n Favorite court \n\n\n\nTennis Court Details\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\tLocation type:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\tClub\t\t\t\t\t\t\t\t\t\n\n\n\n\t\t\t\t\t\t\t\t\t\tMatches played here:\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t0\t\t\t\t\t\t\t\t\t\n\n\n\n\t\t\t\t\t\t\t\t\t\t"

teststring = teststring.replace("\n","  ")
teststring = teststring.replace("\t","  ")

#split any fields with more than 1 whitespace between them
result = re.split("[\s]\s+",teststring)

#remove any empty string fields of the list
while ('' in result):
    result.remove('')

print(result)

Результат:

['Ulmstead Club', '911 Lynch Dr', 'Arnold, Maryland', '21012', 'United States', '(410) 757-9836', 'Get directions', 'Favorite court', 'Tennis Court Details', 'Location type:', 'Club', 'Matches played here:', '0']
0 голосов
/ 14 июня 2019

Я предполагаю, что это простое выражение также может быть полезным,

(?:\\n|\\t)

Демо

Тест

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(?:\\n|\\t)"

test_str = "\\n\\nUlmstead Club\\n\\t\\t\\t\\t\\t911 Lynch Dr\\n\\n\\t\\t\\t\\t\\t\\tArnold, Maryland\\t\\t\\t\\t\\t 21012\\n\\t\\t\\t\\t\\tUnited States\\n(410) 757-9836 \\n\\n Get directions\\n\\n Favorite court \\n\\n\\n\\nTennis Court Details\\n\\n\\n\\n\\n\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tLocation type:\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tClub\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\n\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tMatches played here:\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t0\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\n\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t"

subst = ""

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...