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

时间:2010-10-18 07:13:25

标签: python regex

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

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

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

PS:我还需要在子串模块中引用组(\ S +)。

示例:

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

6 个答案:

答案 0 :(得分:3)

(^A.*B$)|(^A.*$)|(^.*B$)

答案 1 :(得分:2)

^A|B$^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)

答案 2 :(得分:2)

这是理想的行为吗?

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"

答案 3 :(得分:1)

试试这个:

/(^A|B$)/

答案 4 :(得分:1)

问题解决了。

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

  

(?(id/name)yes-pattern|no-pattern)   将尝试匹配yes-pattern if   具有给定id或名称的组   存在,如果它没有模式   没有。无模式是可选的   可以省略。例如,   (<)?(\ w + @ \ w +(?:。\ w +)+)(?(1)>)是一个   糟糕的电子邮件匹配模式   将与''匹配   以及'user@host.com',但不是   “      

版本2.4中的新功能。

所以我的最终答案是:

r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)'

命令:

>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"Aanything")

'什么'

>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"anythingB")

'什么'

虽然AanythingB给了我anythingB,但我还是不在乎。

>>>re.sub(r'(?P<prefix>A)?(?P<key>\S+)(?(prefix)|B)','\g<key>',"AanythingB")

'anythingB'

答案 5 :(得分:0)

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

reMatcher= re.compile(r"(?<=\AA).*|.*(?=B\Z)")

\A使用^\Z使用$

当“A”和“B”都在各自的角落时,这个保留“A”前缀(而不是解决方案的“B”前缀):

'A text here' matches ' text here'
'more text hereB' matches 'more text here'
'AYES!B' matched 'AYES!'
'neither' doesn't match

否则,非正则表达式解决方案(有人会说更多“Pythonic”解决方案)是:

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

如果没有匹配项,则函数返回None以区分可能的''(例如,当被称为strip_prefix_suffix('AB', 'A', 'B')时)。

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

(?<=\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!'

由于某些奇怪的原因,.*(?=B\\Z)子表达式优先,即使它是最后一个替代。