如何在python

时间:2018-04-28 06:54:22

标签: python regex

我知道python方法中的[re.search(pattns,text)] [1]采用正则表达式模式和字符串,并在字符串中搜索该模式。如果搜索成功,则search()返回匹配对象,否则返回None。

我的问题是,我试图使用OOP(类)实现这个我想返回匹配结果的字符串表示,无论是真还是无 或者任何其他形式的表示(可读)不是这个< __ main __。下面的表达式实例位于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

2 个答案:

答案 0 :(得分:1)

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 :(得分: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 obscur表示。

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]