Получить первое слово в скобках в Python

Я погуглил и прочитал некоторые коды здесь Регулярное выражение для возврата текста в круглых скобках

но скажем, например, у меня есть следующая строка

«[Руководство] Сила (STR) рекомендуется воинам (Воины -> Берсерк)»

Как мне выводить только "STR", а не (Воины -> Берсерк)?

Спасибо!

Я думаю, вы на самом деле имеете в виду слово в первой паре круглых скобок, а не первое слово в скобках; в противном случае он также будет включать Warriors.

blhsing 26.10.2018 07:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
936
6

Ответы 6

>>> import re
>>> s = "[Guide] Strength (STR) is recommended on Warriors (Warriors -> Berserker)"
>>> re.search(r'\(([^)]+)\)', s).group(1)
<<< 'STR'

re.search возвращает первое совпадение
.group(1) возвращает содержимое первой группы захвата, то есть ([^)]+).

Или re.split:

>>> import re
>>> s = "[Guide] Strength (STR) is recommended on Warriors (Warriors -> Berserker)"
>>> result = re.split(r"\s+(?=[^()]*(?:\(|$))", s)
>>> next((i[1:-1] for i in result if i[0]=='(' and i[-1]==')'),'No sub-strings that are surrounded by parenthesis')
'STR'
>>> 

Примечание: здесь, если строки не содержат подстроки, заключенные в круглые скобки, он будет выводить 'No sub-strings that are surrounded by parenthesis', если это не нужно, вы можете просто сделать:

>>> next((i[1:-1] for i in result if i[0]=='(' and i[-1]==')'))

Или:

>>> [i[1:-1] for i in result if i[0]=='(' and i[-1]==')'][0]

это также работает, только если текст в круглых скобках, который вы хотите извлечь, не содержит пробелов.

KingRadical 26.10.2018 07:08

@KingRadical Как насчет сейчас?

U12-Forward 26.10.2018 07:15
import re
str1 = "[Guide] Strength (STR) is recommended on Warriors (Warriors -> Berserker)"
m = re.findall(r'(\(\w+\))',str1)
print m

Result:['(STR)']

Здесь строка, которую нам нужно найти в данном тексте, расположена между () без пробелов и специальных символов, поэтому (\ w +) означает более одного символа, присутствующего в ()

Привет, вышеупомянутый комментарий был частью из «Обзора» в переполнении стека. Я не жду вашего ответа. Я просто проверял качество кода. Хорошая практика - добавить некоторые пояснения. Вы можете редактировать свой ответ и можете добавлять комментарии.

Harsha Biyani 26.10.2018 10:20

@Harsha B, спасибо за предложение, в следующий раз это мне напомнит :)

Narendra Lucky 26.10.2018 11:27

Используйте re.search с группой, как объяснил @KingRadical, или используйте re.findall, а затем выберите первый элемент.

s = "[Guide] Strength (STR  are long) is recommended on Warriors (Warriors -> Berserker)"
re.findall('\(([^\)]+)\)', s) # returns all matches

>>> ['STR  are long', 'Warriors -> Berserker']

re.findall('\(([^\)]+)\)', s)[0] # returns the first match which is what you want.

>>> 'STR  are long'

Примечание:

Если в строке s нет совпадений, re.findall вернет пустой список, а re.search вернет объект None.

Вы можете разрезать строку индексами, возвращаемыми str.find:

s = "[Guide] Strength (STR) is recommended on Warriors (Warriors -> Berserker)"
s[s.find('(')+1:s.find(')')]

который возвращает: STR

Рассмотрим следующую строку,

s = 'I am John (John (M) Doe)'

Первым словом в круглых скобках должно быть «Джон (М) Доу», а не «Джон (М». Следующий код будет вести счет открытых и закрытых скобок:

opn = 0
close = 0
new_str = ''
add = False
for i in s:
    if not add:
        if i == '(':
            opn += 1
            add = True
    else:
        if i == '(':
            new_str += i
            opn += 1
        elif i == ')':
            close += 1
            if opn == close:
                break
            else:
                new_str += i
        else:
            new_str += I

print(new_str)

Это дает:

John (M) Doe

Надеюсь это поможет!

Другие вопросы по теме