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

时间:2019-01-15 05:31:42

标签: python regex for-loop

我试图在jupyter笔记本中使用for循环来re.findall()。 我想提取所有包含“加利福尼亚”,“科罗拉多”和“佛罗里达”的句子。 我可以写这些。

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)

4 个答案:

答案 0 :(得分:1)

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

result = re.findall(f"([^.]*?{i}[^.]*\.)", lines) # works in Python 3.6+

答案 1 :(得分:1)

如果您真的想要以一种简洁的方式进行操作,则必须使用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?']

答案 2 :(得分:1)

您不需要循环,只需使用"|".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]))

答案 3 :(得分:0)

为此任务使用单词边界,并列出要存储的列表。

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)