как использовать python re findall и regex, чтобы 2 условия могли выполняться одновременно?

#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. Пожалуйста, проверьте мой вопрос еще раз, я обновил подробности. Спасибо