查找具有正则表达式条件的子字符串

时间:2018-03-20 09:59:14

标签: python regex string python-3.x substring

我希望仅在子字符串在其之前和之后都有字母字母时返回False

e.g。给定目标'at'

strings = ['dad at home', 'eat apple', 'he never ate maple', 'because he hate it']

我想返回[True, True, True, False]

我现在有:

def foo(p,i):
    if p.findall(i):
        return True
    return False

pat = re.compile(r'\bat\b')
[foo(pat,i) for i in strings]

返回[True, False, False, False]

4 个答案:

答案 0 :(得分:1)

您可以使用re.search代替re.findall,因为您只测试字符串 一场比赛。

如果您只需要匹配ASCII,则单词两边的[a-zA-Z]都可以使用。

使用

import re
strs = ['dad at home', 'eat apple', 'he never ate maple', 'because he hate it']

def foo(p,i):
    return False if p.search(i) else True

word = 'at'
pat = re.compile(r'[a-zA-Z]{}[a-zA-Z]'.format(word))
print([foo(pat,i) for i in strs])
# => [True, True, True, False]

请参阅Python demo

如果您打算使用Unicode字母,请将[a-zA-Z]替换为[^\W\d_]。在Python 3中,默认情况下使用re.U,在Python 2中,您需要添加它。

答案 1 :(得分:0)

尝试以下正则表达式

def foo(p,i):
    if p.findall(i):
        return True
    return False
pat = re.compile(r'.*([\w]at[\w]).*')
out  = [not foo(pat,i) for i in strings]
# [True, True, True, False]

答案 2 :(得分:0)

对于您的具体问题,这将是一个非常简单的解决方案。

def foo(text):
    for x in range(len(text)):
        if text[x] == 'a' and text[x+1] == 't':
            if text[x-1].isalnum() and text[x+2].isalnum():
                return False
    return True

答案 3 :(得分:0)

以下是使用re.searchmap函数的可读单行样式解决方案:

import re

strings = ['dad at home', 'eat apple', 'he never ate maple', 'because he hate it']

s = list(map(lambda s: not re.search(r'[\w]at[\w]', s), strings))

print(s)   # [True, True, True, False]