Я погуглил и прочитал некоторые коды здесь Регулярное выражение для возврата текста в круглых скобках
но скажем, например, у меня есть следующая строка
«[Руководство] Сила (STR) рекомендуется воинам (Воины -> Берсерк)»
Как мне выводить только "STR", а не (Воины -> Берсерк)?
Спасибо!
>>> 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 Как насчет сейчас?
import re
str1 = "[Guide] Strength (STR) is recommended on Warriors (Warriors -> Berserker)"
m = re.findall(r'(\(\w+\))',str1)
print m
Result:['(STR)']
Здесь строка, которую нам нужно найти в данном тексте, расположена между () без пробелов и специальных символов, поэтому (\ w +) означает более одного символа, присутствующего в ()
Привет, вышеупомянутый комментарий был частью из «Обзора» в переполнении стека. Я не жду вашего ответа. Я просто проверял качество кода. Хорошая практика - добавить некоторые пояснения. Вы можете редактировать свой ответ и можете добавлять комментарии.
@Harsha B, спасибо за предложение, в следующий раз это мне напомнит :)
Используйте 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
Надеюсь это поможет!
Я думаю, вы на самом деле имеете в виду слово в первой паре круглых скобок, а не первое слово в скобках; в противном случае он также будет включать
Warriors
.