我希望仅在子字符串在其之前和之后都有字母字母时返回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]
。
答案 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.search
和map
函数的可读单行样式解决方案:
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]