Является ли мой неудачный повторный поиск проблемой кодирования? - PullRequest
2 голосов
/ 06 мая 2019

Я пытаюсь удалить символы, которые следуют шаблону, из файла .txt, но мой поиск по регулярному выражению не возвращает ни одного. Соответствующие символы выглядят в текстовом файле иначе, чем при выводе в командной строке.Я новичок в этом и только общие знания о кодировании и декодировании.

Я полагаю, что txt-файл закодирован с использованием ANSI (Windows-1252), и я использую python 3. Я попытался выполнить поиск с использованием нескольких шаблонов регулярных выражений.Каждое регулярное выражение работало при тестировании в RegExr, поэтому я не думаю, что это проблема.

TXT-файл - это выходной файл bulk_extractor, и он выглядит так:

# BANNER FILE NOT PROVIDED (-b option)
# BULK_EXTRACTOR-Version: 1.5.5 ($Rev: 10844 $)
# Feature-Recorder: email
# Filename: W:\Migration\2010013\Working
# Feature-File-Version: 1.1
W:\Migration
2010013\Working/Succession planning/Succession Plan Article
W:\Migration\2010013\Working/Succession planning/Succession Plan Article▯-39612 j26@yahoo.com   397-1911 or</I> j26@yahoo.com</P> <P>\x0A<TABLE 
W:\Migration
2010013\Working/Succession planning/Succession Plan Article
W:\Migration\2010013\Working/Succession planning/Succession Plan Article▯-45963 jaime.brown@gmail.com   <a href="mailto:jaime.brown@gmail.com?subject=Ask The

Очиститьсначала несколько вещей: я знаю, что имена папок не самые лучшие, но я архивариус, поэтому нам приходится работать с каталогами и файлами, какими бы они ни были.Кроме того, указанный адрес электронной почты является примером, а не чьей-либо реальной электронной почтой.

С этим путем я пытаюсь убрать 'Article▯ - #####' с конца пути к файлу.

При выводе в командной строке символ ▯ изменится на ô ?? o, и теперь он будет читать «ô ?? o - #####».Отсюда и «о» в регулярном выражении.Мой код выглядит так:

with open("email.txt", 'r', encoding = 'cp1252') as file:
    all_lines = file.readlines()
    no_header = all_lines[5:]
print (no_header) #for testing

pattern = re.compile('/(ô[?]{2}o[-][0-9]*)')
for i in range(len(no_header)):
    test = re.search(pattern, no_header[i])
    print (test)

Поскольку регулярное выражение работает в RegExr, я ожидал, что для каждой строки будет возвращена строка, соответствующая шаблону.Вместо этого поиск не возвращает ничего для каждой строки.Я также попытался найти символ прямоугольника, используя его код Unicode U + 25AF.Это тоже не сработало.

Кажется, что-то теряется в переводе.Я привык работать с Python 2.7, поэтому я предполагаю, что мне не хватает чего-то здесь, что касается кодирования / декодирования.

Ваша помощь приветствуется!Мы делаем это, чтобы автоматизировать процесс написания метаданных и защитить частные адреса электронной почты отдельных лиц.

1 Ответ

0 голосов
/ 06 мая 2019

Предупреждение, у вас есть /, который является разделителем регулярных выражений в Ruby, но не в Python.

Кроме того, вы можете просто использовать \S+ для сопоставления с любым непробельным символом :

\ S Соответствует любому непробельному символу; это эквивалентно классу [^ \ t \ n \ r \ f \ v].

Вот пример:

email = """# BANNER FILE NOT PROVIDED (-b option)
# BULK_EXTRACTOR-Version: 1.5.5 ($Rev: 10844 $)
# Feature-Recorder: email
# Filename: W:\Migration\2010013\Working
# Feature-File-Version: 1.1
W:\Migration
2010013\Working/Succession planning/Succession Plan Article
W:\Migration\2010013\Working/Succession planning/Succession Plan Article▯-39612 j26@yahoo.com   397-1911 or</I> j26@yahoo.com</P> <P>\x0A<TABLE 
W:\Migration
2010013\Working/Succession planning/Succession Plan Article
W:\Migration\2010013\Working/Succession planning/Succession Plan Article▯-45963 jaime.brown@gmail.com   <a href="mailto:jaime.brown@gmail.com?subject=Ask The"""

import re
print(re.findall('Article\S+', email))
# ['Article▯-39612', 'Article▯-45963']
print(re.findall('Article\S\-\d+', email))
# ['Article▯-39612', 'Article▯-45963']
...