Python регулярное выражение: плоский текстовый файл с несколькими пробелами, но я хочу сохранить имя только с одним пробелом - PullRequest
1 голос
/ 21 марта 2020

У меня есть несколько строк вроде этого:

00000     SomeText    00000    0000
00000     Some'Text    00000    0000
1111     Some Text Text    33    4444

Сейчас я использую:

match = re.search(r'(\d+)\s+([\w@._]+)\s+(\d+)\s+(\d+)', line)

Но я скучаю по всем " Some Text "и" Some Text Text ".

Между каждыми столбцами есть пробел 2+.

Я хочу поймать: - первая цифра - текст только с одним пробелом - вторая цифра - третий ди git

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Вы можете использовать

(\d+)\s+(\S+(?:\s\S+)*)\s+(\d+)\s+(\d+)

или, если это целые строки / строки (может потребоваться опция re.MULTILINE или re.M и [^\S\r\n]+ вместо \s+, если вам нужно обрабатывать один многострочный текст):

^(\d+)\s+(\S+(?:\s\S+)*)\s+(\d+)\s+(\d+)$

См. демонстрационную версию regex

Основной момент здесь \S+(?:\s\S+)*:

  • \S+ - 1+ непробельные символы
  • (?:\s\S+)* - ноль или более последовательностей из
    • \s - пробельные символы
    • \S+ - 1+ непробельные символы
0 голосов
/ 21 марта 2020

вместо довольно длинного регулярного выражения, я бы рекомендовал разбить каждую строку на \s{2,} и протестировать каждый столбец отдельно

text = '''00000     SomeText    00000    0000
00000     Some'Text    00000    0000
1111     Some Text Text    33    4444'''

for line in text.split('\n'):
    c1, c2, c3, c4 = re.split(r'\s{2,}', line)
    if c1.isnumeric() and ('  ' not in c2) and \
       c3.isnumeric() and c4.isnumeric():
        print(line)
# prints:
00000,SomeText,00000,0000
00000,Some'Text,00000,0000
1111,Some Text Text,33,4444
0 голосов
/ 21 марта 2020

Просто замените все \s+ на \s{2,} и добавьте \s ко второй группе столбцов:

match = re.search(r'(\d+)\s{2,}([\w@._\s]+?)\s{2,}(\d+)\s{2,}(\d+)', line)

Другой вариант - использовать re.split вместо re.search:

columns = re.split(r'\s{2,}', line)
...