Python — разделение строки при первом появлении недопустимых символов

#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. Я не вижу того поведения, которое вы описываете. Посмотрите эту демонстрацию .