“如何匹配模式”;以A开头或以B结尾;使用Python正则表达式?

“如何匹配模式”;以A开头或以B结尾;使用Python正则表达式?,python,regex,Python,Regex,结果匹配所有内容,实际上等于^\S$ 如何写一个匹配“以A开头或以B结尾,可以两者都写,但不能两者都写?” PS:我还需要参考子字符串模块中的组(\S+) 例如: 匹配aaanything,anythingB,并在替换中引用anything组。尝试以下操作: r'(^|^A)(\S+)(B$|$)' (^A.*B$)|(^A.*$)|(^.*B$) ^A | B$或^A |.*B$(取决于匹配函数是否从一开始就匹配) 更新 很难为此编写单个regexp 一种可能性是: /(^A|B$)/

结果匹配所有内容,实际上等于^\S$

如何写一个匹配“以A开头或以B结尾,可以两者都写,但不能两者都写?”

PS:我还需要参考子字符串模块中的组(\S+)

例如:

匹配
aaanything
anythingB
,并在替换中引用
anything
组。

尝试以下操作:

r'(^|^A)(\S+)(B$|$)'
(^A.*B$)|(^A.*$)|(^.*B$)

^A | B$
^A |.*B$
(取决于匹配函数是否从一开始就匹配)

更新 很难为此编写单个regexp

一种可能性是:

/(^A|B$)/

这是你想要的行为吗

match = re.match(r'^(?:A(\S+))|(?:(\S+)B)$', string)
if match:
    capture = max(match.groups())
# because match.groups() is either (capture, None) or (None, capture)

问题已解决。

我在python中使用这个正则表达式,我在python手册中找到了:

(?(id/名称)是模式|否模式)
将尝试匹配“是”模式,如果 具有给定id或名称的组 存在,并且没有模式(如果存在) 没有。没有模式是可选的,并且 可以省略。例如 ()是一个 糟糕的电子邮件匹配模式 将与“”匹配为 以及user@host.com’,但不是用 ' 版本2.4中的新功能

所以我的最终答案是:

var rx = /^((?:A)?)(.*?)((?:B)?)$/;
"Aanything".match(rx)
> ["Aanything", "A", "anything", ""]
"anythingB".match(rx)
> ["anythingB", "", "anything", "B"]
"AanythingB".match(rx)
> ["AanythingB", "A", "anything", "B"]
"anything".match(rx)
> ["anything", "", "anything", ""]
"AanythingB".replace(rx, '$1nothing$3');
> "AnothingB"
"AanythingB".replace(rx, '$2');
> "anything"

“anythingB”

如果您不介意在前缀“A”和后缀“B”同时存在的情况下增加额外的权重,您可以使用较短的正则表达式:

>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"AanythingB")
否则,非正则表达式解决方案(有些人会说是更“Pythonic”的解决方案)是:

如果没有匹配项,则函数返回
None
,以区别于可能的
'
(例如,当称为
strip\u prefix\u后缀('AB','a','B')

PS我还应该说这个正则表达式:

def strip_prefix_suffix(text, prefix, suffix):
    left =  len(prefix) if text.startswith(prefix) else 0
    right= -len(suffix) if text.endswith(suffix) else None
    return text[left:right] if left or right else None
(?>text='yes!B'

>>>重新编译(“(?实际上我需要的是获得(\S+)组模式,
^A |。*B$
匹配”
A
anythingB
”,但我需要“
anythingB
”是的,这匹配但不知道替换部分中的哪个组?由于“|”的优先级,您可以省去对备选项的分组运算符,但希望捕获相关的子字符串。这将给您留下
^A(\S*)B$| ^A(\S*)$|(\S*)B$
。最糟糕的是,现在您在三个匹配组中的一个组中获得了所需的子字符串,而您事先不知道是哪一个。因此,您可能需要使用“max(match.groups())'mykhal.ASDF->SDF,SDFB->SDF的方法,但是ASDFB->SDFB或SDF?所以这是一个Python正则表达式。请标记您使用的语言,因为不同的语言实现不同的正则表达式风格,其他语言提供的正则表达式可能与Python的正则表达式引擎不兼容。谢谢,问题解决了。这是我第一次在stackoverflo中发布w、 如果re.match(r'^A\S+$,S):S=S[1:
如果re.match(r'^\S+B$,S):S=S[:-1]
简单得多吗?你的最终答案有不平衡的括号:)条件不应该在
A
上吗?哦,它在样本上,但不在“最终答案”中。…更完整的正则表达式应该是
r'(?PA)?(?P\S+)(?)前缀B)$'
。这样
组('key')
将是非贪婪的,如果开始时有a,则可选为a。因此,'AanythingB'将正确捕获
键(/code>组)中的'anything'。此正则表达式忽略了“两者都不是”操作的要求。虽然这匹配正确的字符串,但它无法捕获相关的子字符串,这是这里的实际困难。我在Python错误跟踪器中打开了一个,因为它可能是re引擎中的错误。
>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"anythingB")
>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"AanythingB")
reMatcher= re.compile(r"(?<=\AA).*|.*(?=B\Z)")
'A text here' matches ' text here'
'more text hereB' matches 'more text here'
'AYES!B' matched 'AYES!'
'neither' doesn't match
def strip_prefix_suffix(text, prefix, suffix):
    left =  len(prefix) if text.startswith(prefix) else 0
    right= -len(suffix) if text.endswith(suffix) else None
    return text[left:right] if left or right else None
(?<=\AA).*(?=B\Z)|(?<=\AA).*|.*(?=B\Z)
>>> text= 'AYES!B'
>>> re.compile('(?<=\\AA).*(?=B\\Z)').search(text).group(0)
'YES!'
>>> re.compile('(?<=\\AA).*').search(text).group(0)
'YES!B'
>>> re.compile('.*(?=B\\Z)').search(text).group(0)
'AYES!'
>>> re.compile('(?<=\\AA).*(?=B\\Z)|(?<=\\AA).*').search(text).group(0)
'YES!'
>>> re.compile('(?<=\\AA).*(?=B\\Z)|.*(?=B\\Z)').search(text).group(0)
'AYES!'
>>> re.compile('(?<=\\AA).*|.*(?=B\\Z)').search(text).group(0)
'AYES!'
>>> re.compile('(?<=\\AA).*(?=B\\Z)|(?<=\\AA).*|.*(?=B\\Z)').search(text).group(0)
'AYES!'