#python #regex #string #split #pattern-matching
#python #регулярное выражение #строка #разделение #сопоставление с образцом
Вопрос:
У меня есть некоторый код на Python, в котором я хочу сканировать и разделять строку при первом появлении недопустимых символов.
import re,string
mystring="my_id=abc-something_123amp;anything#;?lcdkahck;my_id=kckdkkj_bcjc"
if "my_id=" in mystring:
mystring = mystring[mystring.index("my_id=") 6 : len(mystring)][0:100]
mystring = re.split('[;amp;#]', mystring)[0]
print(mystring)
Что происходит при этом, я получаю строку правильно, где;amp;# идет, но мои данные могут иметь любой непредсказуемый символ вместо;amp;# .
Что я пытался вытеснить эти символы
allowable_character = '-' '_' string.ascii_letters string.digits
mystring = re.sub('[^%s]' % allowable_character, '', mystring)
print(mystring)
Но это просто фильтрует строку символами, которых нет в ‘allowable_character’.
Чего я пытаюсь добиться, так это разделить строку один раз на символ, которого нет в ‘allowable_character’, и вернуть эту строку.
Поэтому я хочу, чтобы ожидаемый результат был как ‘abc-something_123’
Здесь приветствуется любая помощь
Комментарии:
1. Учитывая
mystring
, как вы показали выше, какой точный результат вы хотите и почему?2. @TimBiegeleisen — я хочу строку после ‘my_id=’ до любого символа за пределами ‘-‘, ‘_’, букв и цифр. Поэтому, если другие символы выглядят как amp;, ; или что-то еще, я пытаюсь получить подстроку. Пожалуйста, дайте мне знать, если потребуется более подробная информация
Ответ №1:
Вы могли бы просто использовать re.findall
здесь:
mystring = "my_id=abc-something_123amp;anything#;?lcdkahck;my_id=kckdkkj_bcjc"
match = re.findall(r'^my_id=([w-]*).*
Это выводит:
'abc-something_123'
Комментарии:
1. Спасибо @Tim, можете ли вы концептуально объяснить, я новичок в python
2. Шаблон регулярных
^my_id=([w-] ).*$
выражений применяется ко всему вашему вводу один раз. Он захватывает содержимое,my_id=
состоящее только из символов слова или дефиса.3. Я играл с решением, которое вы дали, оно дает правильное значение для всех типов сценариев, кроме 'my_id=amp;anything#;?lcdkahck;my_id=kckdkkj_bcjc', здесь значение mystring должно быть пустым, поскольку между my_id= и 'amp;' нет допустимых символов. Код завершается ошибкой match = re.findall(r'^my_id=([w-] ).*$', sol)[0] Ошибка индекса: список индексов вне диапазона
4. Я не вижу того поведения, которое вы описываете. Посмотрите эту демонстрацию .
, mystring)[0]
print(match)
Это выводит:
Комментарии:
1. Спасибо @Tim, можете ли вы концептуально объяснить, я новичок в python
2. Шаблон регулярных
^my_id=([w-] ).*$
выражений применяется ко всему вашему вводу один раз. Он захватывает содержимое,my_id=
состоящее только из символов слова или дефиса.3. Я играл с решением, которое вы дали, оно дает правильное значение для всех типов сценариев, кроме ‘my_id=amp;anything#;?lcdkahck;my_id=kckdkkj_bcjc’, здесь значение mystring должно быть пустым, поскольку между my_id= и ‘amp;’ нет допустимых символов. Код завершается ошибкой match = re.findall(r’^my_id=([w-] ).*$’, sol)[0] Ошибка индекса: список индексов вне диапазона
4. Я не вижу того поведения, которое вы описываете. Посмотрите эту демонстрацию .