Python 返回非类型vs.返回“&引用;检索

Python 返回非类型vs.返回“&引用;检索,python,regex,search,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

我做了一些搜索,并没有看到这个具体问题,但让我知道,如果它是一个重复

我编写了一个名为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
这个函数工作得很好,但我确信有一种更为python的方式来完成同样的任务,坦白地说,我觉得为这么简单的事情调用自定义函数有点傻

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

re.search("Preceeding\ Text:(.*)$", string).group(1)
问题是,当没有结果时,我会得到一个“非类型”崩溃,因为“非类型”上没有属性“组”。我可以使用if或try/except语句检查结果,但这违背了从使用find_results开始更改的目的

我的问题是:

  • 是否有方法暂停非类型崩溃并让它返回“”(空白)
  • 有没有一种不同的单线方式来实现这一点
  • 如果我必须使用自定义函数,有没有一种更具Pythonic风格(也不那么尴尬)的编写方法

re.findall是搜索一个模式的多个实例的好方法:

r = re.compile("^[^:]*:(.*)$", re.MULTILINE)
r.findall("a: b\nc: d")

这是你想要的一行代码。函数式编程真是太神奇了

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import re

if __name__ == '__main__':

    findme= 'abc'
    sep = ','
    stringa = '1,2,3,4,5,abc'


    print map(lambda line, findme=findme, sep=sep: line.split(sep, 1)[1].strip() if re.search(findme, line) else "", stringa.split('\n'))

您正在寻找的一个班轮是:

return re.findall(r'Preceeding\ Text:(.*)$', text) or ''
如果没有匹配项,
findall()
将返回一个空列表,在这种情况下,您希望结果是
'
,这就是or将执行的操作

不要使用
string
作为变量名,它与内置的字符串模块冲突。

使用:

由于分区总是返回一个3元素的元组,最后一个元素是
'
for not found,这可能是您的一行代码:

>>> s='Preceding Text:the rest'
>>> s[s.find('Text'):].partition(':')[2]
'the rest'
>>> s[s.find('Text'):].partition(';')[2]
''
如果
findme
部分或
分隔符
部分仅在它们是正则表达式时才有用,请使用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 ''
演示:


您可以将正则表达式更改为始终匹配的正则表达式<代码>“foo”可以与
“foo |”
匹配,如果找不到“foo”,则返回到不匹配状态。@Locane如果我的答案解决了您的问题,请确认。谢谢这是我知道的答案,但我不知道如何表达。谢谢你,老兄。PS-我认为你在示例文本中的意思是“先行”。很抱歉成为纳粹,谢谢你的同音词更正。是的,我的意思是“先于”而不是“继续”。这里有一个拼写更正:它是“在前面”而不是“在前面”;-)
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') 
''