Muszę znaleźć daty urodzenia zaczynające się od 18xx i 19xx na podstawie ciągu

Do rozwiązania zadania używam wyrażenia regularnego

Mam testy testbirtdays = 'ABCDEFG 01.19.1701 1801 02.18.1901 2001'

def getNumbers(str): 
    array = re.findall(r'[0-9]+', str) 
    return array 

Mogę użyć tej funkcji, ale wynik będzie:

getNumbers(testbirtdays)

#['01', '19', '1701', '1801', '02', '18', '1901', '2001']

Moja funkcja nie może zrobić 2 rzeczy:

  1. potrzebuję tylko numerów zaczynających się od 18 i 19

  2. Potrzebuję tylko 4x liczb, aby uzyskać tylko lata i zignorować miesiące / dni

Więc potrzebuję danych wyjściowych takich jak:

#['1801','1901']

0
germanjke 2 kwiecień 2020, 11:31

5 odpowiedzi

Najlepsza odpowiedź

Oto jeden sposób:

import re

re.findall(r'\b18\d{2}\b|\b19\d{2}\b', testbirtdays)

Wynik:

['1801', '1901']
2
kederrac 2 kwiecień 2020, 08:44

Możesz użyć

r'(?<![0-9])1[89][0-9]{2}(?![0-9])'

Lub z granicami słów:

r'\b1[89][0-9]{2}\b'

Zobacz demo wyrażenia regularnego nr 1 i demo wyrażenia regularnego nr 2 .

Szczegóły Regex:

  • (?<![0-9]) - cyfra ASCII nie jest dozwolona bezpośrednio po lewej stronie
  • \b - granica słowa
  • 1 - cyfra 1
  • [89] - 8 lub 9
  • [0-9]{2} - dwie cyfry ASCII
  • (?![0-9]) - cyfra ASCII nie jest dozwolona bezpośrednio po prawej stronie lub
  • \b - granica słowa

Zobacz demo Pythona:

import re

def getNumbers(s): 
    return re.findall(r'(?<![0-9])1[89][0-9]{2}(?![0-9])', s) 

testbirtdays = 'ABCDEFG 01.19.1701 1801 02.18.1901 2001'
print(getNumbers(testbirtdays)) # => ['1801', '1901']
3
Wiktor Stribiżew 2 kwiecień 2020, 08:35
test = 'ABCDEFG 01.19.1701 1801 02.18.1901 2001'
pattern = r'1[89]\d{2}'    
re.findall(pattern, test)

Wzorzec szuka 1, po którym następuje 8 lub 9 i 2 kolejne cyfry.

Wynik:

['1801', '1901']

1
purpin 2 kwiecień 2020, 09:37

Spróbuj tego:

def get_years(str):
    return re.findall(r"((?:18|19)\d{2})\b", str)

print(get_years(testbirtdays))

Wynik:

['1801', '1901']
1
Shubham Sharma 2 kwiecień 2020, 08:35

Potrzebujesz bardziej szczegółowego wyrażenia regularnego, takiego jak 1[8-9][0-9]{2}: a 1, potem jedna z 89 i dwie cyfry

Możesz również zrobić (?:18|19)[0-9]{2} zacząć od 18 lub 19, a następnie dwie inne cyfry

def getNumbers(value):
    return re.findall(r'1[8-9][0-9]{2}', value)

r = getNumbers('ABCDEFG 01.19.1701 1801 02.18.1901 2001')
print(r)  # ['1801', '1901']
1
azro 2 kwiecień 2020, 08:35