python和正则表达式的新手,我一直试图找到一种方法,我可以解析一个句子,这样我就可以把它的一部分分配给它们自己的变量。
一个例句是:Laura Compton,来自加利福尼亚州洛杉矶的股票经纪人
我的目标是:姓名=" Laura Compton" (这个很容易,我可以针对锚链接没问题),position =" Stock Broker",city =洛杉矶,州=加州
我需要迭代的所有句子都遵循相同的模式,名称总是在锚标记中,位置始终跟在关闭锚之后,有时它的使用" a"或""所以我想剥掉那些。城市和州总是遵循"来自"
答案 0 :(得分:1)
你可以试试这个:
import re
s = "Laura Compton, a Stock Broker from Los Angeles, California"
new_s = re.findall('^[a-zA-Z\s]+|(?<=a\s)[a-zA-Z\s]+(?=from)|(?<=an\s)[a-zA-Z\s]+(?=from)|(?<=from\s)[a-zA-Z\s]+(?=,)|(?<=,\s)[a-zA-Z\s]+$', s)
headers = ['name', 'title', 'city', 'state']
data = {a:b for a, b in zip(headers, new_s)}
输出:
{'city': 'Los Angeles', 'state': 'California', 'name': 'Laura Compton', 'title': 'Stock Broker '}
答案 1 :(得分:1)
您可以在模式中使用命名组来捕获子字符串,这样可以更容易地引用子字符串,并且代码可以更具可读性:
import re
data = ['Laura Compton, a Stock Broker from Los Angeles, California',
'Miles Miller, a Soccer Player from Seattle, Washington']
pattern = (r'^(?P<name>[^,]+)\, an? (?P<position>.+) from '
r'(?P<city>[^,]+)\, +(?P<state>.+)')
FIELDS = 'name', 'position', 'city', 'state'
for sentence in data:
matches = re.search(pattern, sentence)
name, position, city, state = matches.group(*FIELDS)
print(', '.join([name, position, city, state]))
从样本data
生成的输出:
Laura Compton, Stock Broker, Los Angeles, California
Miles Miller, Soccer Player, Seattle, Washington
A.M。 Kuchling写了一篇名为Regular Expression HOWTO的好教程,你应该退房。