답변:
정규 표현식 사용- 추가 참조를위한 문서
import re
text = 'gfgfdAAA1234ZZZuijjk'
m = re.search('AAA(.+?)ZZZ', text)
if m:
found = m.group(1)
# found: 1234
또는:
import re
text = 'gfgfdAAA1234ZZZuijjk'
try:
found = re.search('AAA(.+?)ZZZ', text).group(1)
except AttributeError:
# AAA, ZZZ not found in the original string
found = '' # apply your error handling
# found: 1234
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> start = s.find('AAA') + 3
>>> end = s.find('ZZZ', start)
>>> s[start:end]
'1234'
그런 다음 원하는 경우 re 모듈과 함께 정규 표현식을 사용할 수도 있지만 필요하지 않습니다.
re
방법이 빠르지 않습니까?
s
, s.find
반환합니다 -1
. 슬라이싱 연산자 s[begin:end]
는이를 유효한 인덱스로 받아들이고 원하지 않는 부분 문자열을 반환합니다.
import re
re.search(r"(?<=AAA).*?(?=ZZZ)", your_text).group(0)
위에있는 AttributeError
"AAA"및 "ZZZ"가 없으면 위와 같이 실패합니다 .your_text
your_text.partition("AAA")[2].partition("ZZZ")[0]
"AAA"또는 "ZZZ"가 존재하지 않으면 위의 문자열은 빈 문자열을 반환합니다 your_text
.
PS Python Challenge?
이를 위해 re 모듈을 사용할 수 있습니다 .
>>> import re
>>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
('1234,)
코드에서이 함수를 사용하여 첫 번째 부분 문자열을 찾을 수 있습니다 (문자 색인 기준). 또한 부분 문자열 뒤의 내용을 찾을 수 있습니다.
def FindSubString(strText, strSubString, Offset=None):
try:
Start = strText.find(strSubString)
if Start == -1:
return -1 # Not Found
else:
if Offset == None:
Result = strText[Start+len(strSubString):]
elif Offset == 0:
return Start
else:
AfterSubString = Start+len(strSubString)
Result = strText[AfterSubString:AfterSubString + int(Offset)]
return Result
except:
return -1
# Example:
Text = "Thanks for contributing an answer to Stack Overflow!"
subText = "to"
print("Start of first substring in a text:")
start = FindSubString(Text, subText, 0)
print(start); print("")
print("Exact substring in a text:")
print(Text[start:start+len(subText)]); print("")
print("What is after substring \"%s\"?" %(subText))
print(FindSubString(Text, subText))
# Your answer:
Text = "gfgfdAAA1234ZZZuijjk"
subText1 = "AAA"
subText2 = "ZZZ"
AfterText1 = FindSubString(Text, subText1, 0) + len(subText1)
BeforText2 = FindSubString(Text, subText2, 0)
print("\nYour answer:\n%s" %(Text[AfterText1:BeforText2]))
>>> s = '/tmp/10508.constantstring'
>>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')
누군가가 내가했던 것과 똑같은 일을해야 할 경우를 대비하여. 괄호 안의 모든 것을 한 줄로 추출해야했습니다. 예를 들어, '미국 대통령 (Barack Obama)과 만난 ...'과 같은 줄이 있고 'Barack Obama'만 얻으려면 이것이 해결책입니다.
regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'
즉, 괄호를 차단해야합니다. slash \
부호가있는 . 파이썬보다 더 정규 표현식에 대한 문제이지만.
또한 어떤 경우에는 정규식 정의 전에 'r'기호가 표시 될 수 있습니다. r 접두사가 없으면 C와 같이 이스케이프 문자를 사용해야 합니다. 이에 대한 자세한 내용은 다음과 같습니다 .
다음은 첫 번째 하위 문자열에 두 번째 하위 문자열이 포함 된 시나리오를 설명하는 정규 표현식이없는 솔루션입니다. 이 함수는 두 번째 마커가 첫 번째 마커 뒤에있는 경우에만 하위 문자열을 찾습니다.
def find_substring(string, start, end):
len_until_end_of_first_match = string.find(start) + len(start)
after_start = string[len_until_end_of_first_match:]
return string[string.find(start) + len(start):len_until_end_of_first_match + after_start.find(end)]
그것을하는 또 다른 방법은 목록을 사용하는 것입니다 (찾고있는 하위 문자열을 바꾸는 것은 숫자로만 이루어집니다).
string = 'gfgfdAAA1234ZZZuijjk'
numbersList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
output = []
for char in string:
if char in numbersList: output.append(char)
print(f"output: {''.join(output)}")
### output: 1234
일치하지 않는 경우 다른 문자열을 반환하는 하나의 라이너. 편집 : 개선 된 버전은 next
기능을 사용 "not-found"
하고 필요한 경우 다른 것으로 바꿉니다.
import re
res = next( (m.group(1) for m in [re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk" ),] if m), "not-found" )
덜 최적화 된이 방법을 사용하는 다른 방법은 정규식 2 시간을 사용하지만 여전히 더 짧은 방법을 찾지 못했습니다.
import re
res = ( ( re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk") or re.search("()","") ).group(1) )