微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试创建提取特殊字符之间的切片的功能

如何解决尝试创建提取特殊字符之间的切片的功能

我有一些我认为可以使用的代码,但是没有用。特别是,在文本中只有开始或结束短语的情况下,我该如何处理。请参阅下面的代码。谢谢!

import re
def extract(text,begin,end):
   result1 = re.search(begin,text)
   if result1 is None:
      index1 = " "
   else:
      index1 = text.find(begin) + len(begin)
   result2 = re.search(end,text)
   if result2 is None:
      index2 = " "
   else:
      index2 = text.find(end)
   return text[index1:index2]

print(extract("Eat an <apple> each day","<",">"))

print(extract("Oh [/b] no","[b]","[/b]"))

#第一种情况按预期方式工作并显示“ apple”。我希望在第二种情况下可以打印“ Oh”,但它不会返回任何内容。为什么不呢?我该如何解决

enter image description here

enter image description here

解决方法

您真的不需要在这里使用正则表达式。实际上,部分原因是 原因,因为您使用了正则表达式。 []是正则表达式中的特殊字符,从本质上讲,它意味着“匹配两个括号之间列出的任何单个字符”。因此,您的字符串将尝试匹配b开头和/b结尾。我们可以不使用正则表达式而仅使用.find方法来执行此操作,该方法实际上会在找不到任何内容的情况下返回-1

def extract(text,begin,end):
    index1 = text.find(begin)
    if index1 != -1:
        index1 += len(begin)
    # start next search at index1,or 0 if begin not found
    index2 = text.find(end,index1 if index1 != -1 else 0)
    print(index1,index2)
    if index2 != -1:
        # end string found!
        return text[index1 if index1 != -1 else 0:index2]
    elif index1 != -1:
        # begin string found!
        return text[index1:index2  if index2 != -1 else len(text)]

print(extract("Eat an <apple> each day","<",">"))
# "apple"
print(extract("Oh [/b] no","[b]","[/b]"))
# "Oh "
print(extract("Oh [b] no","[/b]"))
# " no"
,

使用索引

s = "abcacbAUG[GAC]UGAfjdalfd"
start = s.find("[") + len("[")
end = s.find("]")
substring = s[start:end]
print(substring)

打印GAC

,

主要问题是您的第二个正则表达式。 [b][/b]做的事情与您想像的不同:

  • [b]选择单个字符b
  • [/b]选择单个字符b或单个字符/

如果要与文本中的[/b]相匹配,则必须转义方括号

我还修改了索引评估。由于您已经search字符串并得到结果,因此可以使用result.span()来获取匹配项的索引(起始端为tuple)。

import re
def extract(text,end):
   result1 = re.search(begin,text)
   if result1 is None:
      index1 = 0
   else:
      index1 = result1.span()[1]
   result2 = re.search(end,text)
   if result2 is None:
      index2 = len(text)
   else:
      index2 = result2.span()[0]
   return text[index1:index2]

print(extract("Eat an <apple> each day",">"))
print(extract("Oh [/b] no",r"\[b\]",r"\[/b\]"))
,

如果要使用正则表达式,可以查找:

  • 可选地(但如果可能的话)尽可能多的字符,后跟开始序列(非捕获组)
  • 然后要捕获的字符(任意数量的非换行符,尽管数量尽可能少)
  • 然后是结束序列或行尾(另一个非捕获组)

您需要转义序列(请参阅re.escape的使用),否则可能会成为当前问题的一部分,例如[b]被视为字符类。

def extract(text,end):

    begin = re.escape(begin)
    end = re.escape(end)

    reg = f'(?:.*{begin})?(.*?)(?:{end}|$)'
    match = re.match(reg,text)
    if match:
        return match.group(1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。