如何从Python中的string中提取子string?
比方说,我有一个string'gfgfdAAA1234ZZZuijjk'
,我想只提取'1234'
部分。
我只知道直接在AAA
之前会有几个字符,而在ZZZ
之后我感兴趣的部分是1234
。
用sed
可以用string做这样的事情:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
结果这会给我1234
。
如何在Python中做同样的事情?
使用正则expression式 – 文档以供进一步参考
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'
然后你可以使用regexps和re模块,如果你愿意的话,但这不是必要的。
正则expression式
import re re.search(r"(?<=AAA).*?(?=ZZZ)", your_text).group(0)
如果在your_text
中没有“AAA”和“ZZZ”, your_text
上述原因将会失败,并出现AttributeError
your_text
string方法
your_text.partition("AAA")[2].partition("ZZZ")[0]
如果在your_text
不存在“AAA”或“ZZZ”,上面将返回一个空string。
PS Python的挑战?
import re print re.search('AAA(.*?)ZZZ', 'gfgfdAAA1234ZZZuijjk').group(1)
你可以使用re模块:
>>> import re >>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups() ('1234,)
用sed可以用string做这样的事情:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"
结果这会给我1234。
你可以用re.sub
函数使用相同的正则expression式。
>>> re.sub(r'.*AAA(.*)ZZZ.*', r'\1', 'gfgfdAAA1234ZZZuijjk') '1234'
在基本的sed中,捕获组由\(..\)
,但是在python中由(..)
表示。
你可以在代码中find这个函数的第一个子string(按字符索引)。 另外,你可以find子串后面的内容。
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]))
以防万一有人会做我做的同样的事情。 我不得不一行一行地提取括号内的所有内容。 例如,如果我有像“美国总统奥巴马(Barack Obama)会见……”这样的一句话,而我只想得到“奥巴马(Barack Obama)”,那么这就是解决之道:
regex = '.*\((.*?)\).*' matches = re.search(regex, line) line = matches.group(1) + '\n'
即你需要用slash \
符号来阻止括号。 虽然这是Python的更多正则expression式的问题。
此外,在某些情况下,在正则expression式定义之前,您可能会看到“r”符号。 如果没有r前缀,则需要使用类似于C的转义字符。 这里有更多的讨论。
>>> s = '/tmp/10508.constantstring' >>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')