Python регулярное выражение для поиска в нескольких строках - PullRequest
0 голосов
/ 19 февраля 2020

За последнюю неделю я пытался решить эту проблему, не добившись никакого прогресса. Любая помощь от вас очень ценится.

У меня есть тысячи файлов со следующим текстом:

,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,

Но у некоторых файлов также есть такой способ

,,,,,,,,,,,,,,,,
Location:,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,

Мне нужно извлечь заглавный адрес с помощью регулярных выражений в Python.

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

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

location = re.findall(r'^Location:,,,(.*),,,,,,,,,,,,,\n$|^Location:,,,(.*)[\n.*]{1,2,3,4,5,6},,,,,,,,,,,,,', CSV, flags=re.DOTALL | re.MULTILINE)

Я даже близко? Или есть лучший способ решить эту проблему?

Я благодарен за любую помощь здесь.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

С учетом предоставленных вами фиктивных данных:

s = ''',,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,'''

Вы можете использовать следующее регулярное выражение:

matches = re.findall(r'Location:((?:[^,]*,){16})', s, flags=re.MULTILINE)

Вот как выглядят совпадения:

>>> print('\n\n'.join(matches))
,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,

,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,

Что делать дальше, зависит от значения запятых в исходном файле. Например, вы можете заменить их пробелами:

addrs = [match.replace(',', ' ').strip() for match in matches]

Что выглядит следующим образом:

>>> print('\n\n'.join(addrs))
ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS 
MULTIPLE LINES  BUT NOT A SPECIFIC SET OF LINES 
AND IT ENDS AS ABRUPTLY

ADDRESS IS IN ONE LINE
0 голосов
/ 19 февраля 2020

Вот идея: Вы можете использовать простой цикл для обнаружения и извлечения данных о расположении нескольких строк

# Test data
TEXT=""",,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS_HERE_THAT I WANT
BUT IT CAN ALSO BE ACROSS,
MULTIPLE LINES, BUT NOT A SPECIFIC SET OF LINES,
AND IT ENDS AS ABRUPTLY,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
Location:,,,ADDRESS,IS,IN,ONE,LINE,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
"""

in_location = False
tmp_location = None

def extract_location(l):
    global in_location
    global tmp_location
    if l.startswith("Location:"):
        in_location = True
        tmp_location = []
        # special case
        if l.endswith(',,,,,,,,,,,,,'):
            print(l[13:-13])
            in_location = False
        else:
            tmp_location.append(l[13:]) # Don't need 'Location:,,,'
    else:
        if in_location:
            tmp_location.append(l)
            if l.endswith(',,,,,,,,,,,,,'):
                # The end
                in_location = False
                res =  " ".join(tmp_location)
                print(res[0:-13])  # Remove trailing commas


def main():
    for line in TEXT.split("\n"):
        extract_location(line)


if __name__ == "__main__":
    main()

Допустим, они сохраняются в файл с именем concept.py,

* 1006. *
...