如何从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('.')