두 하위 문자열 사이의 문자열 찾기
의 서브스트링(2개의 서브스트링 해야 하나요?'123STRINGabc' -> 'STRING'
현재 방법은 다음과 같습니다.
>>> start = 'asdf=5;'
>>> end = '123jasd'
>>> s = 'asdf=5;iwantthis123jasd'
>>> print((s.split(start))[1].split(end)[0])
iwantthis
그러나 이것은 매우 비효율적이고 비열해 보인다.이런 일을 하는 더 좋은 방법은 무엇일까요?
이치노문자열이 다음과 같이 시작되지 않을 수 있습니다.start
★★★★★★★★★★★★★★★★★」end
에 더 가 있을 수 . 앞뒤에 더 많은 캐릭터가 있을 수 있습니다.
import re
s = 'asdf=5;iwantthis123jasd'
result = re.search('asdf=5;(.*)123jasd', s)
print(result.group(1))
s = "123123STRINGabcabc"
def find_between( s, first, last ):
try:
start = s.index( first ) + len( first )
end = s.index( last, start )
return s[start:end]
except ValueError:
return ""
def find_between_r( s, first, last ):
try:
start = s.rindex( first ) + len( first )
end = s.rindex( last, start )
return s[start:end]
except ValueError:
return ""
print find_between( s, "123", "abc" )
print find_between_r( s, "123", "abc" )
다음과 같은 기능이 있습니다.
123STRING
STRINGabc
'비슷하게 하다'를 섞을 수 것 요.필요한 행동에 따라서는, 혼재할 수 있습니다.index
★★★★★★★★★★★★★★★★★」rindex
위의 중 합니다(regex는합니다).(.*)
★★★★★★★★★★★★★★★★★」(.*?)
★★★★★★★★★★★★★★★★★★」
start = 'asdf=5;'
end = '123jasd'
s = 'asdf=5;iwantthis123jasd'
print s[s.find(start)+len(start):s.rfind(end)]
주다
iwantthis
s[len(start):-len(end)]
니콜라우스 그라드볼 start
★★★★★★★★★★★★★★★★★」end
을 사용하다
import re
s = 'asdf=5;iwantthis123jasd'
start = 'asdf=5;'
end = '123jasd'
result = re.search('%s(.*)%s' % (start, end), s).group(1)
print(result)
방식 「」을 ..index()
:
text = 'I want to find a string between two substrings'
left = 'find a '
right = 'between two'
# Output: 'string'
print(text[text.index(left)+len(left):text.index(right)])
OP만의 솔루션을 해답으로 변환하는 것만으로,
def find_between(s, start, end):
return (s.split(start))[1].split(end)[0]
source='your token _here0@df and maybe _here1@df or maybe _here2@df'
start_sep='_'
end_sep='@df'
result=[]
tmp=source.split(start_sep)
for par in tmp:
if end_sep in par:
result.append(par.split(end_sep)[0])
print result
표시 필요: here0, here1, here2
regex가 더 좋지만 python에만 사용할 수 있는 추가 lib가 필요합니다.
여기 한 가지 방법이 있다
_,_,rest = s.partition(start)
result,_,_ = rest.partition(end)
print result
regexp를 사용하는 다른 방법
import re
print re.findall(re.escape(start)+"(.*)"+re.escape(end),s)[0]
또는
print re.search(re.escape(start)+"(.*)"+re.escape(end),s).group(1)
다음은 검색된 string1과 string2 사이에 문자열이 있는 목록을 반환하기 위해 수행한 함수입니다.
def GetListOfSubstrings(stringSubject,string1,string2):
MyList = []
intstart=0
strlength=len(stringSubject)
continueloop = 1
while(intstart < strlength and continueloop == 1):
intindex1=stringSubject.find(string1,intstart)
if(intindex1 != -1): #The substring was found, lets proceed
intindex1 = intindex1+len(string1)
intindex2 = stringSubject.find(string2,intindex1)
if(intindex2 != -1):
subsequence=stringSubject[intindex1:intindex2]
MyList.append(subsequence)
intstart=intindex2+len(string2)
else:
continueloop=0
else:
continueloop=0
return MyList
#Usage Example
mystring="s123y123o123pp123y6"
List = GetListOfSubstrings(mystring,"1","y68")
for x in range(0, len(List)):
print(List[x])
output:
mystring="s123y123o123pp123y6"
List = GetListOfSubstrings(mystring,"1","3")
for x in range(0, len(List)):
print(List[x])
output:
2
2
2
2
mystring="s123y123o123pp123y6"
List = GetListOfSubstrings(mystring,"1","y")
for x in range(0, len(List)):
print(List[x])
output:
23
23o123pp123
STRING
, ,::
myString = '123STRINGabc'
startString = '123'
endString = 'abc'
mySubString=myString[myString.find(startString)+len(startString):myString.find(endString)]
이 코드를 사용하거나 아래 함수를 복사할 수 있습니다.한 줄로 깔끔하게.
def substring(whole, sub1, sub2):
return whole[whole.index(sub1) : whole.index(sub2)]
다음과 같이 기능을 실행하면 됩니다.
print(substring("5+(5*2)+2", "(", "("))
출력은 다음과 같습니다.
(5*2
보다는
5*2
출력의 마지막에 서브스트링을 표시하는 경우는, 다음과 같은 코드가 필요합니다.
return whole[whole.index(sub1) : whole.index(sub2) + 1]
단, 끝의 서브스트링을 원하지 않는 경우에는 +1이 첫 번째 값이어야 합니다.
return whole[whole.index(sub1) + 1 : whole.index(sub2)]
이러한 솔루션은 시작 문자열과 마지막 문자열이 다른 것으로 가정합니다.readlines()를 사용하여 파일 전체를 읽는다고 가정할 때 처음과 마지막 인디케이터가 같을 때 파일 전체에 대해 사용하는 솔루션을 다음에 나타냅니다.
def extractstring(line,flag='$'):
if flag in line: # $ is the flag
dex1=line.index(flag)
subline=line[dex1+1:-1] #leave out flag (+1) to end of line
dex2=subline.index(flag)
string=subline[0:dex2].strip() #does not include last flag, strip whitespace
return(string)
예:
lines=['asdf 1qr3 qtqay 45q at $A NEWT?$ asdfa afeasd',
'afafoaltat $I GOT BETTER!$ derpity derp derp']
for line in lines:
string=extractstring(line,flag='$')
print(string)
제공 내용:
A NEWT?
I GOT BETTER!
이것은 본질적으로 cji의 대답이다 - 2010년 7월 30일 5시 58분에.예외의 원인이 무엇인지 좀 더 명확하게 하기 위해 구조를 제외하고 시행을 변경했습니다.
def find_between( inputStr, firstSubstr, lastSubstr ):
'''
find between firstSubstr and lastSubstr in inputStr STARTING FROM THE LEFT
http://stackoverflow.com/questions/3368969/find-string-between-two-substrings
above also has a func that does this FROM THE RIGHT
'''
start, end = (-1,-1)
try:
start = inputStr.index( firstSubstr ) + len( firstSubstr )
except ValueError:
print ' ValueError: ',
print "firstSubstr=%s - "%( firstSubstr ),
print sys.exc_info()[1]
try:
end = inputStr.index( lastSubstr, start )
except ValueError:
print ' ValueError: ',
print "lastSubstr=%s - "%( lastSubstr ),
print sys.exc_info()[1]
return inputStr[start:end]
from timeit import timeit
from re import search, DOTALL
def partition_find(string, start, end):
return string.partition(start)[2].rpartition(end)[0]
def re_find(string, start, end):
# applying re.escape to start and end would be safer
return search(start + '(.*)' + end, string, DOTALL).group(1)
def index_find(string, start, end):
return string[string.find(start) + len(start):string.rfind(end)]
# The wikitext of "Alan Turing law" article form English Wikipeida
# https://en.wikipedia.org/w/index.php?title=Alan_Turing_law&action=edit&oldid=763725886
string = """..."""
start = '==Proposals=='
end = '==Rival bills=='
assert index_find(string, start, end) \
== partition_find(string, start, end) \
== re_find(string, start, end)
print('index_find', timeit(
'index_find(string, start, end)',
globals=globals(),
number=100_000,
))
print('partition_find', timeit(
'partition_find(string, start, end)',
globals=globals(),
number=100_000,
))
print('re_find', timeit(
're_find(string, start, end)',
globals=globals(),
number=100_000,
))
결과:
index_find 0.35047444528454114
partition_find 0.5327825636197754
re_find 7.552149639286381
re_find
가까이 늦다index_find
를 참조해 주세요.
제 방법은 이렇게 하는 거예요
find index of start string in s => i
find index of end string in s => j
substring = substring(i+len(start) to j-1)
이것은 이전에 Daniweb에 코드 스니펫으로 게재한 것입니다.
# picking up piece of string between separators
# function using partition, like partition, but drops the separators
def between(left,right,s):
before,_,a = s.partition(left)
a,_,after = a.partition(right)
return before,a,after
s = "bla bla blaa <a>data</a> lsdjfasdjöf (important notice) 'Daniweb forum' tcha tcha tchaa"
print between('<a>','</a>',s)
print between('(',')',s)
print between("'","'",s)
""" Output:
('bla bla blaa ', 'data', " lsdjfasdj\xc3\xb6f (important notice) 'Daniweb forum' tcha tcha tchaa")
('bla bla blaa <a>data</a> lsdjfasdj\xc3\xb6f ', 'important notice', " 'Daniweb forum' tcha tcha tchaa")
('bla bla blaa <a>data</a> lsdjfasdj\xc3\xb6f (important notice) ', 'Daniweb forum', ' tcha tcha tchaa')
"""
다른 전자 메일 플랫폼의 구분자를 사용하여 텍스트를 구문 분석하면 이 문제의 더 큰 버전이 나타납니다.일반적으로 START와 STOP이 있습니다.와일드카드의 딜리미터 문자가 정규식을 계속 초크합니다.분할에 관한 문제는 여기와 다른 곳에서 언급되어 있습니다.-어머, 딜리미터 문자가 없어졌습니다.replace()를 사용하여 split()에게 소비할 다른 무언가를 줘야겠다는 생각이 들었습니다.코드 청크:
nuke = '~~~'
start = '|*'
stop = '*|'
julien = (textIn.replace(start,nuke + start).replace(stop,stop + nuke).split(nuke))
keep = [chunk for chunk in julien if start in chunk and stop in chunk]
logging.info('keep: %s',keep)
또한 Nikolaus Gradwohl 답변에서 아래 파일 내용(파일명: docker-compose.yml)에서 버전 번호('ui:')와 '-' 사이에 0.0.2)를 취득해야 했습니다.
version: '3.1'
services:
ui:
image: repo-pkg.dev.io:21/website/ui:0.0.2-QA1
#network_mode: host
ports:
- 443:9999
ulimits:
nofile:test
저는 이렇게 동작했습니다(각본).
import re, sys
f = open('docker-compose.yml', 'r')
lines = f.read()
result = re.search('ui:(.*)-', lines)
print result.group(1)
Result:
0.0.2
이것은 나에게 훨씬 더 직설적인 것처럼 보인다.
import re
s = 'asdf=5;iwantthis123jasd'
x= re.search('iwantthis',s)
print(s[x.start():x.end()])
언급URL : https://stackoverflow.com/questions/3368969/find-string-between-two-substrings
'source' 카테고리의 다른 글
manage를 사용하여 CLI에서 데이터베이스를 클리어하는 가장 쉬운 방법은 무엇입니까?장고 파이요? (0) | 2023.01.09 |
---|---|
내부 컨텐츠를 기반으로 iframe 높이를 동적으로 만듭니다 - JQUERY/Javascript (0) | 2023.01.09 |
Java 8: Java.util.function의 TriFunction(및 kin)은 어디에 있습니까?아니면 대체방법이 뭐죠? (0) | 2023.01.09 |
JSR의 용도와 용도는 무엇입니까? (0) | 2023.01.09 |
System.out.println을 사용하지 않는 한 끝이 없는 것처럼 보이는 루프가 종료됩니다. (0) | 2022.12.25 |