使用正则表达式从CSV查找id

2024-04-27 08:02:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个.csv,它包含两列:Namedescription。对于description列中的每一行,我都试图找到特定的文本。它看起来像html或xml格式,我正在考虑使用Elemental Tree XML库,但是没有缩进。每件事都是新的一行,所以我觉得使用Regex将是最简单的方法。下面是其中一行。我把#放进去是因为我不确定这些信息是否敏感。大约走到一半的地方有一个td标记,其中包含一些字母和数字(F00Y009)。这是我试图获取的信息,基本上放在另一个专栏中。我没有太多使用过Regex库,希望能得到一些帮助

到目前为止,这就是我所知道的,但我不太明白如何说“搜索以<;td>;开头的文本包含大写字母和数字,以<;/td>;结尾的文本;(忽略<;之后的“忽略”,stack不会让我做介于两者之间的事情)

import pandas
import re

col_list = ["Name", "description"]
df = pandas.read_csv(path to csv)
id = df["description"][0]
match = re.search("^<td>[A-Z0-9]</td>$", id)
print(match)

输出:

[]

“说明”列中的第一行:

<html ########>

<head>

<META ########>

<meta ########>

</head>

<body style="########">

<table style="########">

<tr style="########">

<td>########</td>

</tr>

<tr>

<td>

<########>

<tr>

<td>########</td>

<td>########</td>

</tr>

<tr bgcolor="#########">

<td>########</td>

<td>########</td>

</tr>

<tr>

<td>########</td>

<td>########</td>

</tr>

<tr bgcolor="#########">

<td>########</td>

<td>F00Y009</td>

</tr>

<tr>

<td>SHAPE</td>

<td>Point</td>

</tr>

<tr bgcolor="######">

<td>########</td>

<td>########</td>

</tr>

<tr>

<td>########</td>

<td>########</td>

</tr>

<tr bgcolor="#######">

<td>########</td>

<td>#######</td>

</tr>

<tr>

<td>########</td>

<td>{########}</td>

</tr>

</table>

</td>

</tr>

</table>

</body>

</html>

期望输出:

<td>F00Y009</td>

Tags: csvname文本lt信息stylehtmltable
2条回答

你可以在这里使用正则表达式

import re
re.findall(r"<td>(\S+)</td>", open('filename.csv').read())

()->;用于分组,\S+匹配非空白字符的任何字符。这与\s相反。如果使用ASCII标志,则该标志相当于[^\t\n\r\f\v]

参考:https://docs.python.org/3/library/re.html

很难说什么是匹配的,什么是不匹配的,因为(目前)关于这些问题的唯一示例是字符串F00Y009,并且(正如您将在下面看到的)匹配的内容很多。另外,我认为您实际上并不希望返回<td>部分,只希望返回ID

一旦你的正则表达式变得完美,试着

import pandas as pd
import re

pattern = r'<td>(\w+)</td>'

df = pd.read_csv(r'test_data.csv', encoding='utf-8-sig')

def find_ids(row):
    ids = re.findall(pattern, row)
    return ids

df['ID'] = [find_ids(row) for row in df['Description']]

df.head()

产出:

    Name    Description ID
0   Janet   <html ########>\n\n<head>\n\n<META ########>\n...   [F00Y009, SHAPE, Point]
1   John    <html ########>\n\n<head>\n\n<META ########>\n...   [F00Y009, SHAPE, Point]
2   Burt    <html ########>\n\n<head>\n\n<META ########>\n...   [F00Y009, SHAPE, Point]
3   Bob <html ########>\n\n<head>\n\n<META ########>\n...   [F00Y009, SHAPE, Point]

我认为您不需要“SHAPE”和“Point”,因此正则表达式可能需要调整,但上面的代码应该会有所帮助。如果更改pattern变量,只需交换分配给它的正则表达式字符串

相关问题 更多 >