Итак, я пытаюсь разобрать кучу цитат из текстового файла, используя модуль re в python 3.4 (в случае, если это имеет значение, Mac работает с mavericks). Вот минимальный код. Обратите внимание, что есть две строки с комментариями: они представляют собой два альтернативных запроса. (Очевидно, что маленький, r'Rawls'
, это тот, который работает)python 3 regex не нашел подтвержденных совпадений
def makeRefList(reffile):
print(reffile)
# namepattern = r'(^[A-Z1][A-Za-z1]*-?[A-Za-z1]*),.*(\(?\d\d\d\d[a-z]?[.)])'
# namepattern = r'Rawls'
refsTuplesList = re.findall(namepattern, reffile, re.MULTILINE)
print(refsTuplesList)
Строка в вопросе некрасиво, и поэтому я воткнул его в сутью: https://gist.github.com/paultopia/6c48c398a42d4834f2ae
Как уже отмечалось, строка поиска r'Rawls'
производит ожидаемый выход ['Rawls', 'Rawls']
. Однако другая строка поиска просто создает пустой список.
Я подтвердил это регулярное выражение (частично), используя тестер regex101. Подтверждение здесь: https://regex101.com/r/kP4nO0/1 - этот матч соответствует тому, что я ожидаю. Поскольку он работает в тесте, он должен работать в коде, не так ли?
(пь я скопировал текст из терминала вывода из первой команды печати, а затем вручную заменить \ п символов в строке с возвратом каретки для regex101.)
Одним из возможной проблемы в том, что питон добавляется флаг байткода (это маленький бит, называемый «флаг?») для строки. Это артефакт моей попытки конвертировать текст из utf-8 в ascii, и я не понял, как заставить его уйти.
Тем не менее, очевидно, что он способен анализировать строки в этой форме. Я знаю это, потому что я конвертирую два текстовых файла с utf-8 в ascii, а следующий код отлично работает на другой строке, преобразованный из другого текстового файла, который также имеет немного b перед ним:
def makeCiteList(citefile):
print(citefile)
citepattern = r'[\s(][A-Z1][A-Za-z1]*-?[A-Za-z1]*[ ,]? \(?\d\d\d\d[a-z]?[\s.,)]'
rawCitelist = re.findall(citepattern, citefile)
cleanCitelist = cleanup(rawCitelist)
finalCiteList = list(set(cleanCitelist))
print(finalCiteList)
return(finalCiteList)
другой кусок текста, который код непосредственно выше соответствует правильно: https://gist.github.com/paultopia/a12eba2752638389b2ee
Единственная гипотеза, что я могу придумать, что первый, сломанный, регулярное выражение выражение рвет на комбинации символов новой строки, а строка обрабатывается как объект байта, хотя я знаю, что регулярное выражение верное для новых строк (потому что подтверждение из связанного regex101) и b) я знаю, что оно соответствует строкам (потому что подтверждение из успешного совпадения на другой строке).
Если это правда, я не знаю, что с этим делать.
Таким образом, вопросы:
1) Является ли моя гипотеза правильно, что это сочетание строки и b
, что взрывает мое регулярное выражение? Если нет, то что? 2) Как это исправить?
a) замените символы новой строки на что-то в строке? б) переписать регулярное выражение так или иначе? c) как-то избавиться от этого b
и снова превратить его в обычную строку? (как?)
спасибо!
Добавление
В случае, если это проблема, мне нужно исправить вверх, вот код, я использую, чтобы получить текстовые файлы и конвертировать в ASCII, заменив не-ASCII символы:
эта функция вызывается с файлами UTF-8 .txt спасенных TextWrangler в индивидуалистах
def makeCorpoi(citefile, reffile):
citebox = open(citefile, 'r')
refbox = open(reffile, 'r')
citecorpus = citebox.read()
refcorpus = refbox.read()
citebox.close()
refbox.close()
corpoi = [str(citecorpus), str(refcorpus)]
return corpoi
, а затем эта функция вызывается на каждый элементе списка вышеприведенной функции возвращает.
def conv2ASCII(bigstring):
def convHandler(error):
return ('1FOREIGN', error.start + 1)
codecs.register_error('foreign', convHandler)
bigstring = bigstring.encode('ascii', 'foreign')
stringstring = str(bigstring)
return stringstring