Захватить текст между ',' - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть строка в тексте, содержащая запятые. Я хочу захватить данные между запятыми.

line = "",,,,,,,,,ce: appears to assume ,that\n

Я использовал шаблон захвата регулярных выражений = (""),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)\\n

Вывод:

Output 1
1.  ""
2.  ,
3.  Empty
4.  Empty
5.  Empty
6.  Empty
7.  Empty
8.  Empty
9.  ce: appears to assume
10. that

Я хотел получить вывод:

Output 2
1.  ""
2.  Empty
3.  Empty
4.  Empty
5.  Empty
6.  Empty
7.  Empty
8.  Empty
9.  Empty
10. ce: appears to assume, that

В основном я ищу какой-то общий жадный метод, который игнорирует запятую ',' между текстом

Ответы [ 4 ]

2 голосов
/ 26 апреля 2019

Вы можете использовать itertools.groupby здесь для фильтрации по длине:

import itertools

someline = '"",,,,,,,,ce: appears to assume ,that\n'

# Group by length greater than 0
res = [(i, ','.join(x)) for i,x in itertools.groupby(someline.split(','), key=lambda x: len(x)>0)]

# [(True, '""'), (False, ',,,,,,'), (True, 'ce: appears to assume ,that\n')]

# Then you can just gather your results
results = []
for i, x in res:
    if i is True:
        results.append(x)
    else:
        results.extend(x.split(','))

results
# ['""', '', '', '', '', '', '', '', 'ce: appears to assume ,that\n']

Это позволяет вам не проверять определенное количество запятых, если оно не является фиксированным значением в строке.

Другой формат

Тем не менее, я думаю, что реальная проблема заключается в том, что запятые являются не только разделителями, но и элементами данных, что делает эту проблему несколько неоднозначной.В документах выглядит так, что вы можете указать другой формат вывода, например .tsv, который будет разделяться на \t и позволит избежать проблемы в целом:

tabula.convert_into("test.pdf", "output.tsv", output_format="tsv", pages='all')

Тогда ваши строки будут выглядеть так:

someline = '""\t\t\t\t\t\t\t\tce: appears to assume ,that\n'

# Much easier to handle
someline.split('\t')

# ['""', '', '', '', '', '', '', '', 'ce: appears to assume ,that\n']
2 голосов
/ 26 апреля 2019

Regex кажется неправильным решением Если вы знаете, сколько совпадений у вас будет (вам предписано 10), вы знаете, сколько запятых вы ожидаете. Используйте str.split

>>> line.split(',', 9)
['""', '', '', '', '', '', '', '', '', 'ce: appears to assume ,that\n']
0 голосов
/ 27 апреля 2019

Проблема в том, что .* соответствует слишком большому числу символов, включая запятые.Вы должны создать группы, которые соответствуют всем символам , за исключением для запятых, что-то вроде

^(""),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)$

Последняя может соответствовать запятым, чтобы она могла соответствовать запятым в ce: appears to assume ,that

#!/usr/bin/env python

import re

reg = re.compile('^(""),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)$')

match = reg.match('"",,,,,,,,,ce: appears to assume ,that\n')

for i in range(1,11):
    print('{:>2s}.  {}'.format(str(i),"Empty" if len(match.group(i))==0 else match.group(i)))

Дает желаемый результат

 1.  ""
 2.  Empty
 3.  Empty
 4.  Empty
 5.  Empty
 6.  Empty
 7.  Empty
 8.  Empty
 9.  Empty
10.  ce: appears to assume ,that```
0 голосов
/ 26 апреля 2019

Не знаю, нужны ли вам все пустые.Пусть это то, что вы ищете

separados = line.split(',,')

for i in range(len(separados)):
    try:  #you can add more custom filters here
        if separados[i][0] == ',': separados[i] = separados[i][1:]
    except: pass
    try:
        if separados[i][-1] == ',': separados[i] = separados[i][:-1]
    except: pass

это то, что вы получаете

'""'
''
''
''
'ce: appears to assume ,that\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...