выполняя регулярные выражения на date.txt - PullRequest
0 голосов
/ 04 марта 2020

следующие данные являются фрагментом из date.txt: https://github.com/BRAKESH3336/sample/blob/master/dates.txt

задача состоит в том, чтобы извлечь даты в формате: 20.04.2009, 20.04.09, 4 / 20/09, 4/3/09

, если данные импортируются как одна строка, регулярное выражение работает

df='''
03/25/93 Total time of visit (in minutes):
6/18/85 Primary Care Doctor:
sshe plans to move as of 7/8/71 In-Home Services: None
7 on 9/27/75 Audit C Score Current:
2/6/96 sleep studyPain Treatment Pain Level (Numeric Scale): 7
.Per 7/06/79 Movement D/O note:
4, 5/18/78 Patient's thoughts about current substance abuse:
10/24/89 CPT Code: 90801 - Psychiatric Diagnosis Interview
3/7/86 SOS-10 Total Score:
(4/10/71)Score-1Audit C Score Current:
(5/11/85) Crt-1.96, BUN-26; AST/ALT-16/22; WBC_12.6Activities of Daily Living (ADL) Bathing: Independent
4/09/75 SOS-10 Total Score:
'''
pattern= re.compile(r'\d{0,2}[/]\d{1,2}[/]\d{2,4}')
matches=pattern.finditer(df)
for match in matches:
    print(match)

, однако, когда данные импортируются с использованием open () регулярное выражение не работает

doc = []
with open('dates.txt') as file:
    for line in file:
        doc.append(line)

df = pd.Series(doc)
df.head(10)

pattern= re.compile(r'\d{0,2}[/]\d{1,2}[/]\d{2,4}')
matches=pattern.finditer(df)
for match in matches:
    print(match)

С чего бы это? Я получаю ошибку:

--------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-83-c6639f3c12f4> in <module>
      1 pattern= re.compile(r'\d{0,2}[/]\d{1,2}[/]\d{2,4}')
----> 2 matches=pattern.finditer(df)
      3 for match in matches:
      4     print(match)

TypeError: expected string or bytes-like object

1 Ответ

0 голосов
/ 05 марта 2020

Сообщение об ошибке не требует пояснений: метод finditer ожидает, что вторым параметром будет объект string или bytes-like, но вы передаете ему экземпляр Series. Поскольку вы уже прочитали файл как строку в переменную doc, ваш код должен быть следующим:

matches=pattern.finditer(''.join(doc))

Кроме того, ваше регулярное выражение действительно должно быть:

r'\d{1,2}/\d{1,2}/\d{2}(?:\d{2})?'
  1. \d{1,2} Соответствует 1 или 2 цифрам. У вас было \d{0,2}, делающее месяц необязательным (например, допуская совпадение /5/2020), что на самом деле не то, что вы хотите.
  2. / Соответствует форварду sla sh. Не нужно иметь [/] (хотя это не так), что было бы более полезно, если вы хотите разрешить несколько разделителей, например [/-].
  3. \d{1,2} Соответствует 1 или 2 цифрам.
  4. / Соответствует прямому слэ sh.
  5. \d{2}(?:\d{2})? Соответствует 2 или 4 цифрам (соответствует 2 цифрам, за которыми необязательно следуют еще 2 цифры. Это более точно, чем то, что было у вас, которое будет соответствовать 2, 3 или 4 цифрам.

Кроме того, более "Pythoni c" (и эффективный) способ создания списка строк, состоящих из каждой строки в текстовом файле, будет быть:

with open('dates.txt') as file:
    doc = [line for line in file]

Использует ли pandas какую-либо цель на данный момент? Если нет, то просто прочитайте весь файл как одну строку:

with open('dates.txt') as file:
    doc = file.read()

И затем в дальнейшем нет необходимости в каком-либо соединении строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...