回答:
-正規表現の使用説明書をさらに参照するために
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モジュールでregexpsを使用することもできますが、それはあなたのケースでは必要ありません。
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チャレンジ?
コード内でこの関数を使用して最初の部分文字列を見つけることができます(文字インデックスによって)。また、部分文字列の後に何があるかを見つけることができます。
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('.')
text = 'I want to find a string between two substrings'
left = 'find a '
right = 'between two'
print(text[text.index(left)+len(left):text.index(right)])
与える
string
念のため、誰かが私と同じことをしなければならないでしょう。括弧内のすべてを一行に抽出する必要がありました。たとえば、「米国大統領(バラクオバマ)と出会った...」のような行があり、「バラクオバマ」だけを取得したい場合、これが解決策です。
regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'
つまり、括弧をブロックする必要があります slash \
記号で。Pythonよりも正規表現の問題ですが。
また、場合によっては、正規表現の定義の前に「r」記号が表示されることがあります。r接頭辞がない場合は、Cのようにエスケープ文字を使用する必要があります。これについては、以下で詳しく説明します。
これは、最初の部分文字列に2番目の部分文字列が含まれるシナリオも考慮した正規表現なしのソリューションです。この関数は、2番目のマーカーが最初のマーカーの後にある場合にのみ部分文字列を検索します。
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)]
一致しない場合に他の文字列を返す1つのライナー。編集:改良版は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) )