#python #regex
#python #регулярное выражение
Вопрос:
вот моя строка данных :
MYDATA=DATANORMAL
MYDATA=DATA_NOTNORMAL
я использую этот код, но когда я его запускаю, он показывает пустой в DATANORMAL
mydata = re.findall(r'MYDATA=(.*)' r'_.*', mystring)
print mydata
и это просто показывает : NOTNORMAL
я хочу, чтобы оба работали и отображали данные следующим образом:
DATANORMAL
NOTNORMAL
как мне это сделать? Спасибо.
Комментарии:
1. Вы хотите удалить только
DATA_
префикс из таких слов, какDATA_NOTNORMAL
или есть и другие префиксы, которые нужно удалить? КакINFO_NOTNORMAL
бы нужно было удалитьINFO_
или нет?2. Вероятно, вам следует принять один из ответов (или опубликовать свой собственный ответ и принять это), а затем опубликовать новый вопрос с вашими обновленными требованиями.
Ответ №1:
import re
mystring = """
MYDATA=DATANORMAL
MYDATA=DATA_NOTNORMAL
"""
mydata = re.findall(r'^s*MYDATA=(?:. _)?(. ?)s*$', mystring, re.M)
print(mydata)
В случае, если вам нужно слово до _
, а не после, тогда используйте регулярное r'^s*MYDATA=(. ?)(?:_. )?s*$'
выражение в приведенном выше коде, вы можете попробовать этот второй вариант здесь.
Комментарии:
1. да, это работает, но я хочу противоположного, ваш скрипт отображает данные после символа
_
, что, если я хочу отобразить данные перед символом_
?2. @gmpsorg Чтобы захватить строку, прежде
_
чем использовать это регулярное выражение в моем кодеr'^s*MYDATA=(. ?)(?:_. )?s*$'
, вы можете попробовать это онлайн!
Ответ №2:
Исходя из того, что вы описали, вы можете захотеть использовать здесь чередование:
bMYDATA=((?:DATA|(?:DATA_))S )b
Скрипт:
inp = "some text MYDATA=DATANORMAL more text MYDATA=DATA_NOTNORMAL"
mydata = re.findall(r'bMYDATA=((?:DATA|(?:DATA_))S )b', inp)
print(mydata)
Это печатает:
['DATANORMAL', 'DATA_NOTNORMAL']
Комментарии:
1. Строка, с которой вы работаете, немного отличается от «строки» в OP? Хотя, я думаю, это может не иметь значения, поскольку граница слова все равно будет правильно соответствовать началу.
2. @cs95 Ваш профиль просто потрясающий… очень немногие люди, присоединившиеся за последние 5 лет, имеют более 60 золотых медалей. Как вам удалось это сделать?
3. За последние 5 лет у очень немногих людей было столько сообщений, сколько у меня, я считаю это признаком моего участия на протяжении многих лет 🙂
4. @Tim Biegeleisen: да, но этого не может быть, если «MYDATA=» произвольные данные, потому что мои данные — это не единственные два данных.
5. Пожалуйста, проверьте мой вопрос еще раз, я обновил подробности. Спасибо
Ответ №3:
Я думаю, вам нужно добавить flags=re.M
?
import re
mystring = """
MYDATA=DATANORMAL
MYDATA=DATA_NOTNORMAL"""
pattern = re.compile("MYDATA=(?:DATA_)?(w )",flags=re.M)
print(pattern.findall(mystring))
Комментарии:
1. да, но это не может быть, если
MYDATA=
произвольные данные, потому что мои данные — это не единственные два данных.2. Пожалуйста, проверьте мой вопрос еще раз, я обновил подробности. Спасибо