如何提取两个标记之间的子字符串?

lskq00tm  于 2021-09-29  发布在  Java
关注(0)|答案(19)|浏览(423)

假设我有一根绳子 'gfgfdAAA1234ZZZuijjk' 我只想提取 '1234' 部分
我只知道前面的几个字是什么 AAA ,及之后 ZZZ 我感兴趣的部分 1234 .
具有 sed 可以使用字符串执行以下操作:

echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"

这会给我 1234 因此。
如何在python中执行相同的操作?

pkmbmrz7

pkmbmrz71#

如果没有匹配项,则返回另一个字符串的一行程序。编辑:改进版本使用 next 功能,替换 "not-found" 如果需要,可以使用其他工具:

import re
res = next( (m.group(1) for m in [re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk" ),] if m), "not-found" )

我的另一种方法,不太理想,第二次使用regex,仍然没有找到一种更短的方法:

import re
res = ( ( re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk") or re.search("()","") ).group(1) )
jmo0nnb3

jmo0nnb32#

打字稿。获取其他两个字符串之间的字符串。
在前缀和后缀之间搜索最短字符串
前缀-字符串/字符串数组/null(表示从开始搜索)。
postfix-字符串/字符串数组/null(表示搜索到结尾)。

public getStringInBetween(str: string, prefixes: string | string[] | null,
                          postfixes: string | string[] | null): string {

    if (typeof prefixes === 'string') {
        prefixes = [prefixes];
    }

    if (typeof postfixes === 'string') {
        postfixes = [postfixes];
    }

    if (!str || str.length < 1) {
        throw new Error(str + ' should contain ' + prefixes);
    }

    let start = prefixes === null ? { pos: 0, sub: '' } : this.indexOf(str, prefixes);
    const end = postfixes === null ? { pos: str.length, sub: '' } : this.indexOf(str, postfixes, start.pos + start.sub.length);

    let value = str.substring(start.pos + start.sub.length, end.pos);
    if (!value || value.length < 1) {
        throw new Error(str + ' should contain string in between ' + prefixes + ' and ' + postfixes);
    }

    while (true) {
        try {
            start = this.indexOf(value, prefixes);
        } catch (e) {
            break;
        }
        value = value.substring(start.pos + start.sub.length);
        if (!value || value.length < 1) {
            throw new Error(str + ' should contain string in between ' + prefixes + ' and ' + postfixes);
        }
    }

    return value;
}
vfh0ocws

vfh0ocws3#

使用正则表达式-供进一步参考的文档

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
hc8w905p

hc8w905p4#

>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> start = s.find('AAA') + 3
>>> end = s.find('ZZZ', start)
>>> s[start:end]
'1234'

然后,您也可以将regexps与re模块一起使用,如果您愿意的话,但在您的情况下这不是必需的。

bgibtngc

bgibtngc5#

正则表达式

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挑战?

gkn4icbw

gkn4icbw6#

令人惊讶的是,没有人提到这是我的一次性脚本快速版本:

>>> x = 'gfgfdAAA1234ZZZuijjk'
>>> x.split('AAA')[1].split('ZZZ')[0]
'1234'
zlhcx6iw

zlhcx6iw7#

import re
print re.search('AAA(.*?)ZZZ', 'gfgfdAAA1234ZZZuijjk').group(1)
idfiyjo8

idfiyjo88#

您只需使用一行代码即可完成

>>> import re

>>> re.findall(r'\d{1,5}','gfgfdAAA1234ZZZuijjk')

>>> ['1234']

结果将收到列表。。。

bxjv4tth

bxjv4tth9#

您可以使用re模块进行以下操作:

>>> import re
>>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
('1234,)
t98cgbkg

t98cgbkg10#

使用sed,可以使用字符串执行以下操作: echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|" 这个结果会给我1234。
你也可以这样做 re.sub 函数使用相同的正则表达式。

>>> re.sub(r'.*AAA(.*)ZZZ.*', r'\1', 'gfgfdAAA1234ZZZuijjk')
'1234'

在基本sed中,捕获组由 \(..\) ,但在python中,它由 (..) .

iugsix8n

iugsix8n11#

在python中,可以使用 findall 正则表达式中的方法( re )模块。

>>> import re
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> ss = re.findall('AAA(.+)ZZZ', s)
>>> print ss
['1234']
kcwpcxri

kcwpcxri12#

>>> s = '/tmp/10508.constantstring'
>>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')
u91tlkcl

u91tlkcl13#

您可以在代码中找到使用此函数的第一个子字符串(按字符索引)。此外,您还可以找到子字符串后面的内容。

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]))
arknldoa

arknldoa14#

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
6bc51xsx

6bc51xsx15#

以防万一有人会做和我一样的事。我必须把括号里的所有东西都提取出来。例如,如果我有一句像“美国总统(巴拉克·奥巴马)会见……”这样的话,我只想得到“巴拉克·奥巴马”,这就是解决方案:

regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'

i、 e.您需要使用 slash \ 签名尽管这是一个关于python中更多正则表达式的问题。
此外,在某些情况下,您可能会在正则表达式定义之前看到“r”符号。如果没有r前缀,则需要使用c中的转义字符。这里有更多的讨论。

相关问题