Тире вътре в набори в регулярни изрази на Python
Тирето - също е специален символ вътре в [ ]
(а отвън - не е). Ако имате нужда от самото
тире като символ - го поставете там,
където няма да бъде възприето като разделител
на група.
Защо това е важно: можете да създадете група
от символи, без самите да го забележите. Например,
ето така - '[:-@]' - вие мислите, че
избирате две точки, тире и знак @, а всъщност
се получава група от символи между
: и @. В тази група влизат
следните символи: ? < = > :
Откъде са се взели? От таблицата ASCII - две точките имат по-малък номер от знака @ - и се получава група. Тоест всички групи се получават според таблицата ASCII (ако желаете можете да използвате това).
Как да се справим с това: поставете символа
тире там, където със сигурност няма да бъде възприет
като символ на група, например, в началото или
в края (тоест след [ или пред
]).
Можете също така да екранирате тирето - тогава
то ще обозначава само себе си независимо
от позицията. Например, вместо [:-@]
да напишете [:\-@] - и вече няма да има
група, а ще има три символа - две точки,
тире и знак @.
Пример
В следващия пример шаблонът за търсене е такъв:
цифра 1, следвана от буква от 'a'
до 'z', следвана от цифра 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! 1-2 ! !'
Пример
Нека сега екранираме тирето. В
резултат шаблонът за търсене е такъв: цифра
1, следвана от буква 'a', или
тире, или буква 'z', следвана от цифра
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! ! 1c2 !'
Пример
Можете просто да пренаредите тирето, без да го екранирате:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! ! 1c2 !'
Пример
В следващия пример шаблонът за търсене е такъв:
първият символ е малки букви или
тире '-', следвано от две букви
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! Axx ! @xx'
Пример
В следващия пример шаблонът за търсене е такъв:
първият символ е малки, главни
букви или тире '-', следвано от две букви
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! ! ! @xx'
Пример
Можете да поставите тирето между две групи - там то със сигурност няма да създаде още една група:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! ! ! @xx'
Практически задачи
Даден е низ:
txt = 'xaz xBz xcz x-z x@z'
Намерете всички низове по следния шаблон:
буква 'x', главна или малка
буква или тире, буква 'z'.
Даден е низ:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Намерете всички низове по следния шаблон:
буква 'x', следвана от долар, или
тире или плюс, следвана от буква 'z'.