如何在Python中返回re.search()函数的字符串表示形式

8
我知道在Python中,[re.search(pattns,text)][1]方法需要一个正则表达式模式和一个字符串,并在字符串中搜索该模式。如果搜索成功,search()将返回一个匹配对象,否则返回None。
我的问题是,我想使用面向对象编程(类)来实现这个方法,我想返回匹配结果的字符串表示形式,无论是True还是None或其他可读形式,而不是像<__main__.Expression instance at 0x7f30d0a81440>这样的形式。以下是两个示例类:Student和Epression。使用__str__(self)__函数的那个可以正常工作,但我无法弄清楚如何获取re.search()的表示形式。 请有人帮帮我。
import re   

class Expression:
    def __init__(self,patterns,text):

        self.patterns = patterns
        self.text = text


    def __bool__(self):
    # i want to get a readable representation from here
        for pattern in self.patterns:
           result = re.search(pattern,self.text)
           return result



 patterns = ['term1','term2','23','ghghg']
 text = 'This is a string with term1 23 not ghghg the other'

 reg = Expression(patterns,text)
 print(reg)


 class Student:

    def __init__(self, name):

       self.name = name


   def __str__(self):
    # string representation here works fine
        result = self.name 
        return result

 # Usage:

  s1 = Student('john')
  print(s1)


 [1]: https://developers.google.com/edu/python/regular-expressions

我的代码片段 - Seyyid Said
2个回答

8
re.search的输出结果是一个匹配对象,它告诉你正则表达式是否与字符串匹配。
你应该确定要从匹配中检索字符串的组,方法如下:
if result: 
    return result.group(0)

请将您代码中的return result替换为上面的代码片段。

如果您不确定group的工作方式,这里有一个来自文档的示例:

>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist") 
>>> m.group(0) # The entire match 
'Isaac Newton' 
>>> m.group(1) # The first parenthesized subgroup. 
'Isaac' 
>>> m.group(2) # The second parenthesized subgroup. 
'Newton' 
>>> m.group(1, 2) # Multiple arguments give us a tuple. 
('Isaac', 'Newton')

1
首先,你的代码中有一个微妙的 错误:

def __bool__(self):
    for pattern in self.patterns:
       result = re.search(pattern,self.text)
       return result

在第一次迭代结束时,返回搜索模式的结果后,其他模式将被忽略。
您可能需要像这样的内容:
def __bool__(self):
    result = True
    for pattern in self.patterns:
       result = result or bool(re.search(pattern,self.text))
    return result

关于表示,您可以使用.group(0)。这将返回匹配的字符串,而不是re.Match的模糊表示。
import re

s = re.search(r"ab", "okokabuyuihiab")

print(s.group(0))
# "ab"

如果你使用模式列表,也许可以改用以下方式:

results = [re.search(pattern, seld.text) for pattern in self.patterns]
representation = [r.group(0) for r in results if r else None]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接