2015-12-16 6 views
2

Я ищу регулярное выражение, которое превращает эту строку:Python Regex удалить цифры, за исключением лет

'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 

в эту строку:

'foo bar 1992  some text' 

То есть, я хочу, чтобы удалить все цифры от строка, за исключением цифр, которые представляют годы (1000 - 2999).

Я искал регулярное выражение функции, что делает что-то вроде

(<PATTERN1> except <PATTERN2>) 

я смог придумать <PATTERN1> и <PATTERN2>:

<PATTERN1> -> \b[0-9(.,)+]*\b 
<PATTERN2> -> \b[12]{1}[0-9]{3}\b 

В коде:

>>> import re 
>>> s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
>>> re.sub(r'\b[0-9(.,)+]*\b', '', s) 
'foo bar   some text' 
>>> import re 
>>> print re.sub(r'\b[0-9(.,)+]*\b', '', s) 
foo bar   some text 
>>> re.sub(r'\b[12]{1}[0-9]{3}\b', '', s) 
'foo bar 12 3.4 32 112 0433 3312 182470921358 3,412 some text' 

Но я не смог собрать их вместе. Положительный lookbehind тоже не делает этого.

Это: только

(?<=\b[12]{1}[0-9]{2})[0-9(.,)+]{1}\b 

матчи 2 из 1992 вместо 1992 полностью.

Любые предложения?

+7

Есть ли причина, по которой вам нужно использовать регулярные выражения? Вы можете просто использовать 'split()' и удалить элементы, которые являются числами за пределами диапазона. – Arc676

ответ

1

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

>>> s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
>>> print re.sub(r'\b(?!(\D\S*|[12][0-9]{3})\b)\S+\b', '', s) 
'foo bar 1992  some text' 

RegEx Demo

(?!(\D\S*|[12][0-9]{3}) будет соответствовать всем, что начинается с нецифровой или нелетний номер за пределами 1000-2999.

+1

Вот что я искал. Благодарю. –

1

Вы можете использовать следующий подход и определить, попадает ли каждый номер в правильный диапазон. Это позволяет легко изменять диапазон номеров, если требуется:

import re 

def year(match): 
    try: 
     if 1000 <= int(match.group(1)) <= 2999: 
      return match.group(1) 
    except ValueError, e: 
     pass 
    return '' 


text = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
print re.sub('([0-9,.]+)', year, text) 

Это выведет:

foo bar 1992  some text 
0
import re 
s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
p = r'((\b[0-9][0-9.,]{0,2}\b)|(\b[0-9][0-9.,]{4,}\b))|(\b[03-9][\d]{3}\b)' 
print re.sub(p, '', s) 

выход:

'foo bar 1992  some text' 

Глупый метод.

Смежные вопросы