Python正则表达式:如何使用正则表达式读取文本文件并仅从包含2个名称的任何行中提取名称
假设我只需要txt文件中包含两个名称的行,例如:Python正则表达式:如何使用正则表达式读取文本文件并仅从包含2个名称的任何行中提取名称,python,regex,python-3.x,findall,Python,Regex,Python 3.x,Findall,假设我只需要txt文件中包含两个名称的行,例如: <td >Jacob</td> <td>273,844</td> <td >Emily</td> <td>223,690</td></tr> Jacob 273844 Emily 223690 txt文件包含以下文本: <tr > <th style="text-align:right; backgroun
<td >Jacob</td> <td>273,844</td> <td >Emily</td> <td>223,690</td></tr>
Jacob 273844 Emily 223690
txt文件包含以下文本:
<tr >
<th style="text-align:right; background-color:white; color:black" scope="col">Rank</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="male name">Name</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="male number">Number</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="female name">Name</th>
<th style="text-align:right; background-color:white; color:black" abbr="female number">Number</th>
</tr>
</thead>
<tbody>
<tr ><td>1</td>
<td >Jacob</td> <td>273,844</td> <td >Emily</td> <td>223,690</td></tr>
<tr ><td>2</td>
<td >Michael</td> <td>250,554</td> <td >Madison</td> <td>193,152</td></tr>
<tr ><td>3</td>
<td >Joshua</td> <td>231,926</td> <td >Emma</td> <td>181,257</td></tr>
<tr ><td>4</td>
<td >Matthew</td> <td>221,513</td> <td >Olivia</td> <td>156,000</td></tr>
<tr ><td>5</td>
等级
名称
数
名称
数
1.
雅各布273844艾米丽223690
2.
迈克尔250554麦迪逊193152
3.
约书亚231926艾玛181257
4.
马修221513奥利维亚156000
5.
使用regex“^([a-zA-Z]+).*([a-zA-Z]+).*”
如何仅使用re.findall编译列表来提取名称
提前谢谢。方法1
我想,你可以简单地用你的表达式来调用它,或者用它的一个稍加修改的版本,比如:
^\h*<td\s*>([^<\r\n]+)<\/td\s*>.*<td\s*>([^<\r\n]+)<\/td\s*>
如果您希望简化/更新/探索表达式,将在的右上面板中进行解释。如果您感兴趣,可以查看匹配步骤或在中修改它们。调试器演示了如何逐步使用一些示例输入字符串并执行匹配过程
方法2 也许,更好的方法是使用bs4,尽管: 测试2 产出2
它需要是正则表达式吗?像
行中的“Jacob”或第
行中的“Emily”这样的东西,其中行
是文件中的一行,就足够了吗?@dddjewelsbb是的,这需要在正则表达式中完成。假设它可以在一行代码中完成。我已经尝试过了,但它只返回空列表。是否可以通过输入文件来完成此代码?
import re
string = '''
<tr >
<th style="text-align:right; background-color:white; color:black" scope="col">Rank</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="male name">Name</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="male number">Number</th>
<th style="text-align:right; background-color:white; color:black" scope="col" abbr="female name">Name</th>
<th style="text-align:right; background-color:white; color:black" abbr="female number">Number</th>
</tr>
</thead>
<tbody>
<tr ><td>1</td>
<td >Jacob</td> <td>273,844</td> <td >Emily</td> <td>223,690</td></tr>
<tr ><td>2</td>
<td >Michael</td> <td>250,554</td> <td >Madison</td> <td>193,152</td></tr>
<tr ><td>3</td>
<td >Joshua</td> <td>231,926</td> <td >Emma</td> <td>181,257</td></tr>
<tr ><td>4</td>
<td >Matthew</td> <td>221,513</td> <td >Olivia</td> <td>156,000</td></tr>
<tr ><td>5</td>
'''
print(re.findall(r'<td\s*>([a-zA-Z]+)<\/td\s*>.*<td\s*>([a-zA-Z]+)<\/td\s*>.*', string))
[('Jacob', 'Emily'), ('Michael', 'Madison'), ('Joshua', 'Emma'), ('Matthew', 'Olivia')]
import re
from bs4 import BeautifulSoup
f = open('/path/to/your/filename.txt', 'r+b')
names = []
try:
soup = BeautifulSoup(f.read(), 'html.parser')
finally:
f.close()
for l in soup.find_all('td'):
if re.match(r'\D+', l.text):
names.append(l.text)
print(names)
['Jacob', 'Emily', 'Michael', 'Madison', 'Joshua', 'Emma', 'Matthew', 'Olivia']