Python正则表达式:如何使用正则表达式读取文本文件并仅从包含2个名称的任何行中提取名称

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

假设我只需要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; 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']