2015-10-06 2 views
1

Скажем у вас есть строка, например, как это:Как сравнить строки с заполнителей в Python

"ERROR: Error Number %d, Error Location 0x%x, found exception" 

Предположим, вы пишете программу для поиска текстового файла в поисках точной строки, но вы не заботитесь о заполнители %d, %x, но вы хотите, чтобы вы правильно соответствовали строке. как бы вы это сделали?

Можно подумать, почему бы просто не сравнить подстроку: "ERROR: Error Number" ..., предположим, что в текстовом файле есть другие строки с той же начальной подстрокой "ERROR: Error Number", но вы не хотите их захватывать.

+0

просто использовать модуль повторно – tinySandy

ответ

0

Опять же, используется RegEx

Вы должны преобразовать формат в RegEx:

  • сначала, избегая не-алфавита анумерные символы;
  • заменить каждый формат (например: %d) соответствующим RegEx (например: \d+);
  • добавить операторов ^ и $, чтобы обеспечить точное соответствие;
  • скомпилируйте RegEx для оптимизации;
  • использовать match, findall и т.д.

Вот пример:

import re 

my_format = "ERROR: Error Number %d, Error Location 0x%x, found exception" 

# Escape all non-alphanumeric characters in pattern 
my_regex = re.escape(my_format) 

# Mapping: pattern => regex 
mapping = [(r"\%d", r"\d+"), 
      (r"\%x", r"[0-9a-f]+")] 

# Substitute each pattern by regex 
for pattern, regex in mapping: 
    my_regex = my_regex.replace(pattern, regex) 

# Add begin/end operator for exact match 
my_regex = "^" + my_regex + "$" 
print(my_regex) 

# Compile the RegEx, extract the 'match' function 
match_my_regex = re.compile(my_regex, re.DOTALL).match 

samples = ["789", 
      "ERROR: Error Number 123, Error Location 0xaf, found exception", 
      "ERROR: Error Number 456, Error Location 0xa0, found exception", 
      "Got ERROR: Error Number 123, Error Location 0xaf, found exception"] 

for sample in samples: 
    print("{0}: match => {1}".format(sample, match_my_regex(sample) is not None)) 

Вы получите:

789: match => False 
ERROR: Error Number 123, Error Location 0xaf, found exception: match => True 
ERROR: Error Number 456, Error Location 0xa0, found exception: match => True 
Got ERROR: Error Number 123, Error Location 0xaf, found exception: match => False 
+0

Что происходит, когда у меня есть строка с указанными ширинами: 0x% 08x, где шестнадцатеричный номер заполняется 8 символами. Каким будет выражение регулярного выражения, чтобы справиться с этой шириной? –

+0

Использование: r "[0-9a-f] {8}" –

1

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

http://pythex.org/?regex=ERROR%3A%5CsError%5CsNumber%5Cs(%5Cd%2B)%2C%5CsError%5CsLocation%5Cs0x(%5Cd%2B)%2C%5Csfound%5Csexception&test_string=ERROR%3A%20Error%20Number%2032%2C%20Error%20Location%200x420%2C%20found%20exception&ignorecase=0&multiline=0&dotall=0&verbose=0

Пример:

import re 
arr = ['testing', 'ERROR: Error Number 32, Error Location 0x420, found exception', 'test'] 
regex = re.compile('ERROR:\sError\sNumber\s(\d+),\sError\sLocation\s0x(\d+),\sfound\sexception') 
for string in arr: 
    if re.match(regex, string): 
     print(string) 
Смежные вопросы