通过python中的regex进行数据操作,以删除/编辑括号中的某些数据。

时间:2013-10-02 18:07:06

标签: python regex python-2.7 data-manipulation

我的数据操作有点问题...... 这是示例代码,通常数据中的每一行都会出现在变量下:“data”

import re

datas = """Class (EN)
    Class (NA)
    CLASS (AA)
    CLASS-TWO (AA)
    Class3-A-H (NO)"""

datas = datas.split("\n")

for data in datas:
    data = data.strip()
    data = re.sub(r'\s*\(\w+\)\s*$', '', data)
    print data

如果您运行上述代码,则返回的学校课程没有课程代码(括号中的部分)

但是,我有一些需要不同处理的变化...

示例:应返回CLASS (NA) (N/A)CLASS (N/A)

示例#2:CLASS (NA) (BB)应该返回:CLASS (B/B) (BB)唯一一个应该永远不会删除但是改为到(B/B)

例如以下数据:

CLASS (EN)
CLASS (NA) (BB)
CLASS (AA) (N/A)
CLASS (N/A)
CLASS (BB)

应该返回:

CLASS
CLASS (B/B)
CLASS (N/A)
CLASS (N/A)
CLASS (B/B)

我认为这是相当复杂的,我已经尝试了很多东西,但老实说,我正在与正则表达式部分斗争

提前致谢 - Hyflex

2 个答案:

答案 0 :(得分:4)

这样做的简单方法分两步。

首先,将每个(BB)转换为(B/B)(如果需要,您可以使用str.replace代替re.sub

然后,由于(B/B)不再与模式匹配,因此您现有的代码已经做了正确的事情。

所以:

data = re.sub(r'\(BB\)', '(B/B)', data)
data = re.sub(r'\s*\(\w+\)\s*$', '', data)

答案 1 :(得分:2)

这个怎么样?

import re

datas = """Class (EN)(EL)
    Class (NA)
    CLASS (AA)
    CLASS-TWO (AA)
    Class3-A-H (NO)"""

datas = datas.split("\n")

for data in datas:
    data = data.strip()
    data = re.sub(r'^([^ ]+?) +.*\((.)/?(.)\) *$', r'\1 (\2/\3)', data)
    print data
结果与问题相同:

Class (E/L)
Class (N/A)
CLASS (A/A)
CLASS-TWO (A/A)
Class3-A-H (N/O)