Python:如何删除以特定字符结尾的行?

2024-04-25 10:15:53 发布

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

我有一个大的数据文件,我需要删除以某些字母结尾的行。在

下面是我使用的文件示例:

User Name     DN
MB212DA       CN=MB212DA,CN=Users,DC=prod,DC=trovp,DC=net
MB423DA       CN=MB423DA,OU=Generic Mailbox,DC=prod,DC=trovp,DC=net
MB424PL       CN=MB424PL,CN=Users,DC=prod,DC=trovp,DC=net
MBDA423       CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net
MB2ADA4       CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=netenter code here

我使用的代码:

^{pr2}$

如何使用正则表达式语法删除以“DA”和“PL”结尾的单词,但确保不会删除其他行,因为它们包含“DA”或“PL”?在

它应该删除这些行,最后得到这样一个文件:

User Name     DN
MBDA423       CN=MBDA423,OU=DNA,DC=prod,DC=trovp,DC=net
MB2ADA4       CN=MB2ADA4,OU=DNA,DC=prod,DC=trovp,DC=net

前3行被删除,因为它们以DA和PL结尾


Tags: 文件namenet结尾ouproddccn
3条回答

代替regular expressions,您可以使用^{}方法来检查字符串是否以特定模式结束。在

即:

for row in rows:
    if row.endswith('DA') or row.endswith('PL'):
        #doSomething

您应该使用过滤后的数据创建另一个df,然后使用pd.to_csv()来保存文件的干净版本。在

你可以用这个表达式

df = df[~df['User Name'].str.contains('(?:DA|PL)$')]

它将返回所有不以DA或PL结尾的行

?:是为了使括号不会捕获任何内容。否则,您将看到熊猫返回以下(无害)警告:

^{pr2}$

或者,使用endswith()而不使用正则表达式,则可以通过使用以下表达式来实现相同的过滤:

df = df[~df['User Name'].str.endswith(('DA', 'PL'))]

正如预期的那样,没有正则表达式的版本会更快。一个简单的测试,由big_df组成,其中包括10001份df原件:

# Create a larger DF to get better timing results
big_df = df.copy()

for i in range(10000):
    big_df = big_df.append(df)

print(big_df.shape)

>> (50005, 2)

# Without regular expressions
%%timeit
big_df[~big_df['User Name'].str.endswith(('DA', 'PL'))]

>> 10 loops, best of 3: 22.3 ms per loop

# With regular expressions
%%timeit
big_df[~big_df['User Name'].str.contains('(?:DA|PL)$')]

>> 10 loops, best of 3: 61.8 ms per loop

您可以使用布尔掩码来检查User_Name的最后两个字符是否在由两个字符结尾组成的集合中不在(~)中:

>>> df[~df.User_Name.str[-2:].isin(['DA', 'PA'])]
  User_Name                                                 DN
2   MB424PL    CN=MB424PL, CN=Users, DC=prod, DC=trovp, DC=net
3   MBDA423      CN=MBDA423, OU=DNA, DC=prod, DC=trovp, DC=net
4   MB2ADA4  CN=MB2ADA4, OU=DNA, DC=prod, DC=trovp, DC=nete...

相关问题 更多 >