2013-05-20 2 views
0

У меня возникли проблемы с преобразованием выражения RegEx в python. Я знаю, что '(\\d+)' является выражением для одного целого числа, но я не могу понять, как получить целое число [2-9].Проблемы с Python Regex

регулярное выражение выражение выглядит следующим образом:

[2-9][p-z][a-h][2-9][a-z]*[p-z][2-9][p-z][2-9][p-z] 

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

  re1='(\\d+)' # Integer Number 1 
      re2='([a-z])' # Any Single Word Character (Not Whitespace) 1 
      re3='([a-z])' # Any Single Word Character (Not Whitespace) 2 
      re4='(\\d+)' # Integer Number 2 
      re5='((?:[a-z][a-z]+))' # Word 1 
      re6='(\\d+)' # Integer Number 3 
      re7='([a-z])' # Any Single Word Character (Not Whitespace) 3 
      re8='(.)' # Any Single Character 1 
      re9='([a-z])' # Any Single Word Character (Not Whitespace) 4 
  ## Regex search for passcodes ## Thanks to Pierluigi Failla 
      rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9,re.IGNORECASE|re.DOTALL) 
      m = rg.search(txt) 
      if m: 
       int1=m.group(1) 
       w1=m.group(2) 
       w2=m.group(3) 
       int2=m.group(4) 
       word1=m.group(5) 
       int3=m.group(6) 
       w3=m.group(7) 
       c1=m.group(8) 
       w4=m.group(9) 
       txt2='"'+int1+w1+w2+int2+word1+int3+w3+c1+w4+'"' 
       return [txt2] 
+5

Но '[2-9] 'является правильной для сравнения целого числа, которое является 2- 9. Итак, что вы хотите совместить в первую очередь? Какие ложные срабатывания вы получаете? Каковы примеры строк, которые вы сопоставляете? – migg

+0

Этот вопрос очень неясен. Первый expr и код ниже не совпадают. – dansalmo

+1

Вы хотите использовать необработанные строки 'r''', чтобы избежать всех удвоенных' \\ ', и существует режим' re.VERBOSE', чтобы упростить чтение прочитанных выражений, чем объединение 9 отдельных строк. –

ответ

1

Я предлагаю этот код, основанный на том, что я вижу в вашем вопросе:

import re 

pat = ('([2-9])'  # Integer Number 1 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 1 
     '([a-h])'  # Any Single Word Character (Not Whitespace) 2 
     '([2-9])'  # Integer Number 2 
     '([a-z]*[p-z]+)' # Word 1 
     '([2-9])'  # Integer Number 3 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 3 
     '(.)'   # Any Single Character 1 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 4 
     ) 
rg = re.compile(pat) 

txt = 'jiji4pa6fmlgkfmoaz8p#q,,,,,,,,,,' 
m = rg.search(txt) 
if m: 
    text2 = "%s%s%s%s%s%s%s%s%s" % m.groups() 
    print text2 

# prints 4pa6fmlgkfmoaz8p#q 

EDIT

text2 = ''.join(m.groups()) # is better 
+0

Основываясь на других комментариях, \ d все еще сопоставляет каждое целое число. Было бы более конкретным использовать ([2-9]) вместо этого? – Mondrianaire

+0

О, мне очень жаль. Я скопировал из серии re1, re2 и т. Д., Но вы правы: если вам не нужны цифры 0 и 1, вы должны использовать '' [2-9] '' вместо '' \ d''. Я исправил свой код – eyquem

+0

@Mondrianaire Спасибо. Я не знаю, где мой мозг сегодня; Я отредактировал свой ответ, чтобы дать более простой способ получить результат в случае этой проблемы. – eyquem

2

Вы должны иметь возможность использовать диапазон 2-9 в Python, например: re1 = re.compile(r'[2-9]'). Тест в моей консоли затем показал, что re1.match('7') возвращает MatchObject, как вы хотите, тогда как re1.match('0') возвращает None, также как вы хотите.

Возможно, вы использовали диапазон [a-z] в re2, где вы сказали, что хотите [p-z] - аналогичные проблемы в других диапазонах символов.

+0

Спасибо, я знал, что выражение, которое я использовал, было намного более мягким, чем я хотел быть, я был не уверен, что использование [2-9] было правильным синтаксисом для python. – Mondrianaire

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