python:如何在findall中使用for循环

python:如何在findall中使用for循环,python,regex,for-loop,Python,Regex,For Loop,我正在尝试使用for循环在jupyter笔记本中重新生成.findall()。 我想提取所有包含“California”、“Colorado”和“Florida”的句子。 我可以写这些 import re f =open("C:/Users/uib57309/Desktop/test.txt",mode='rt') lines = f.read() f.close() re.findall(r"([^.]*?California[^.]*\.)",lines) re.findall(r"(

我正在尝试使用for循环在jupyter笔记本中重新生成.findall()。 我想提取所有包含“California”、“Colorado”和“Florida”的句子。 我可以写这些

import re

f =open("C:/Users/uib57309/Desktop/test.txt",mode='rt')
lines = f.read()
f.close()

re.findall(r"([^.]*?California[^.]*\.)",lines)

re.findall(r"([^.]*?Colorado[^.]*\.)",lines)

re.findall(r"([^.]*?Florida[^.]*\.)",lines)
但如何使用for循环缩短代码? 我试着这样做,但这似乎是错误的

test_list = ['California', 'Colorado', 'Florida'] 

for i in test_list: 

     result = re.findall(r"([^.]*?i[^.]*\.)",lines)

print(result)

将单词边界用于此任务,并创建一个要存储的列表

result
变量将随循环的每次迭代而被覆盖

test_list = ['California', 'Colorado', 'Florida'] 
x = []

for i in test_list: 
    pattern = r"\b"+i+r"\b"
    result = re.findall(pattern,lines)
    x.append(result)

print(x)

在for循环中,结果是查找具有文字“i”字符串字符的所有搜索。 使用f字串(适用于3.6+);字符串连接或格式化也可以:

result=re.findall(f“([^.]*?{i}[^.]*\”,lines)#在Python3.6+中工作

如果您真的想以干净的方式完成,那么必须使用NLTK来分隔句子。您的代码依赖于句点总是分隔句子的假设,但通常情况下,这不是真的

import nltk
import re

lines = "Hello, California! Hello, e.g., Florida? Bye Massachusetts"

states = ['California', 'Colorado', 'Florida'] 

# Create a regex from the list of states
states_re = re.compile("|".join(states)) 

results = [sent for sent in nltk.sent_tokenize(lines) \
           if states_re.search(sent)] # Check the condition
#['Hello, California!', 'Hello, e.g., Florida?']

您不需要循环,只需创建一个带有
“|”的正则表达式。join

test_list = ['California', 'Colorado', 'Florida']
result = re.findall(r"([^.]*?{}[^.]*\.)".format("|".join(test_list)),lines)
为了确保单词不是子字符串,请使用单词边界(对于那些特定的单词来说,这并不是必需的,但对于一般情况,它是必需的。然后表达式使用一个带有r
\b
字符的换行符:

r"([^.]*?{}[^.]*\.)".format("|".join([r"\b{}\b".format(x) for x in test_list]))

您不需要循环。请使用正则表达式
|