python - 在 re.search 中返回 NoneType 与返回 ""

标签 python regex search

我做了一些搜索,但没有看到这个具体问题,但请告诉我它是否重复。

我编写了一个名为 find_results 的函数,它在字符串中搜索分隔符,然后返回分隔符和新行之间的任何内容:

def find_results(findme, separator, string):
    linelist=string.split('\n')
    for line in linelist:
        if re.search(findme, line):
            #Split based on the separator we were sent, but only on the first occurrance
            line = line.split(separator, 1)
            return line[1].strip()
        #End if line.find
    #end for loop
    return ""
#end find_results

该函数工作得很好,但我确信有一种更 Pythonic 的方法来完成相同的任务,坦率地说,我觉得为如此简单的事情调用自定义函数有点愚蠢。

我最近学习了如何在正则表达式中使用集合,因此在某些情况下我能够用 re.search 调用替换该函数。如果分隔符是冒号,例如:

re.search("Preceeding\ Text:(.*)$", string).group(1)

这样做的问题是,当没有结果时,我会遇到“NoneType”崩溃,因为“NoneType”上没有属性“group”。我可以使用 if 或 try/except 语句检查结果,但这违背了使用 find_results 进行更改的目的。

我的问题是:

  • 有没有办法暂停 NoneType 崩溃并让它返回“”(空白)?
  • 是否有一种不同的单行方法可以实现这一目标?
  • 如果我必须使用自定义函数,是否有更 Pythonic(且不那么尴尬)的编写方式?

最佳答案

使用str.partition :

def find_results(findme, separator, s):
    tgt=s[s.find(findme):]
    return tgt.partition(separator)[2]

>>> find_results('Text', ':', 'Preceding Text:the rest')  
'the rest'
>>> find_results('Text', ';', 'Preceding Text:the rest')  
''
>>> find_results('text', ':', 'Preceding Text:the rest')  
''

由于分区总是返回一个 3 元素元组,最后一个元素是 '' 表示未找到,这甚至可能是您的一个衬垫:

>>> s='Preceding Text:the rest'
>>> s[s.find('Text'):].partition(':')[2]
'the rest'
>>> s[s.find('Text'):].partition(';')[2]
''

如果 findme 部分或 separator 部分仅在正则表达式时才有用,请将 re.split 与 try/except 结合使用:

def find_re_results(findme, separator, s):
    p1=re.compile(findme)
    p2=re.compile(separator)
    m=p1.search(s)
    if m:
        li=p2.split(s[m.start():], maxsplit=1)
    else:
        return ''
    try:
        return li[1]
    except IndexError:
        return ''

演示:

>>> find_re_results('\d+', '\t', 'Preceding 123:;[]\\:the rest') 
''
>>> find_re_results('\d+', '\W+', 'Preceding 123:;[]\\:the rest') 
'the rest'
>>> find_re_results('\t', '\W+', 'Preceding 123:;[]\\:the rest') 
''

关于python - 在 re.search 中返回 NoneType 与返回 "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858513/

相关文章:

java - 如果替换字符串包含特殊(某些正则表达式)字符,如何替换java中的字符串

javascript - 加快 UL LI 列表中超过 5000 个对象的 AJAX 搜索速度

python - 使用 raw_input 定义要搜索的变量列表

python - pandas 应用 np.histogram 来 reshape 数据框

python - CherryPy 以 Cheetah 作为插件 + 工具 - 空白页

java - 匹配多语言数字的正则表达式不检测中文数字

regex - 替换正则表达式匹配中的字符

python - 使用 urllib 下载 pdf?

c - HashMap 与 search.h

c# - 在 C# 中标记前后插入文本的最佳算法?