寻找一个词接一个词的方法,Python

2024-05-19 12:03:06 发布

您现在位置:Python中文网/ 问答频道 /正文

如何创建一个函数来获取“class”后面的单词,只要它不是引号(单引号、双引号或任何三引号)并且拼写正确(不能获取class d()

"class hi()"  > hi

"class hi(dff)"  > hi

"class hi   (  dff  )  :"  > hi 

"  class        hi       (  dff  )  :"  > hi 

"class hi"  > hi

"classf hi"  > Nothing

"fclass hi"  > Nothing

"'class hi(dd)'"  > Nothing

'"class hi(dd)"'  > Nothing

"'''class hi(dd)'''"  > Nothing

'"""class hi(dd)"""'  > Nothing

'"""\n\n\n\nclass hi(dd)\n\n\n\n"""'  > Nothing    

"'class' hi()"  > Nothing

使用循环创建太难了。如果有人能帮忙那就太好了,谢谢。这很有挑战性


Tags: 函数hi单词dd引号classnothing双引号
3条回答
import re

def remove(reg, s, multiline=False):
    flags = [re.M, re.M | re.DOTALL][multiline]
    s,num = re.subn(reg, "", s, flags=flags)
    return s

def classname(s):
    s = remove("\"\"\".*?\"\"\"", s, multiline=True)
    s = remove("\'\'\'.*?\'\'\'", s, multiline=True)
    s = remove("\".*?\"", s)
    s = remove("\'.*?\'", s)

    res = re.search("(^|\s)class\s+(\w+)", s, flags=re.M)
    # print "*** {} -> {}".format(s, res.groups() if res else None)
    if res is None:
        return None
    else:
        return res.group(2)

我想使用\b而不是(^ | \s),但它似乎不想工作?你知道吗

我还编写了以下测试代码:

tests = [
    ("class hi()", "hi"),
    ("class hi(dff)", "hi"),
    ("class hi   (  dff  )  :", "hi"),
    ("  class        hi       (  dff  )  :", "hi"),
    ("class hi", "hi"),
    ("classf hi", None),
    ("fclass hi", None),
    ("'class hi(dd)'", None),
    ('"class hi(dd)"', None),
    ("'''class hi(dd)'''", None),
    ('"""class hi(dd)"""', None),
    ('"""\n\n\n\nclass hi(dd)\n\n\n\n"""', None),   
    ("'class' hi()", None),
    ("a = ''; class hi(object): pass", "hi")
]

def run_tests(fn, tests=tests):
    for inp,outp in tests:
        res = fn(inp)
        if res == outp:
            print("passed")
        else:
            print("FAILED on {} (gave '{}', should be '{}')".format(inp, repr(res), repr(outp)))

也许是这样的?你知道吗

from StringIO import StringIO
from tokenize import generate_tokens
from token import NAME

def classname(s):
    g = generate_tokens(StringIO(s).readline)   # tokenize the string
    it = iter(g)
    for toknum, tokval, _, _, _  in it:
        if (toknum == NAME and tokval == 'class'):
            return it.next()[1]

print classname("class hi(29):")

使用正则表达式:

pattern = re.compile(r"\s*class\s+(\w+)")

例如:

>>> line_to_test = "  class        hi       (  dff  )  :" 
>>> match = pattern.match(line_to_test)
>>> match
<org.python.modules.sre.MatchObject object at 0x3>
>>> match.groups()
('hi',)

相关问题 更多 >

    热门问题