2015-06-03 4 views
0

Итак, я пытаюсь разобрать кучу цитат из текстового файла, используя модуль 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 

ответ

1

Aah. Я отследил его и ответил на свой вопрос. По-видимому, на декодированной вещи нужно вызвать какой-то метод кодирования. Следующий код создает реальную строку, с символами новой строки и все, из другого конца (хотя теперь я должен исправить кучу других ошибок, прежде чем я могу понять, если конечный результат, как и ожидалось):

def conv2ASCII(bigstring): 
    def convHandler(error): 
     return ('1FOREIGN', error.start + 1) 
    codecs.register_error('foreign', convHandler) 
    bigstring = bigstring.encode('ascii', 'foreign') 
    newstring = bigstring.decode('ascii', 'foreign') 
    return newstring 

видимо, функция str() не выполняет ту же работу по причинам, которые таинственны для меня. Это, несмотря на ответ здесь How to make new line commands work in a .txt file opened from the internet?, который предполагает, что он это делает.

Смежные вопросы