Python 从字符串文本中提取代码

Python 从字符串文本中提取代码,python,regex,text-mining,Python,Regex,Text Mining,我创建了一个pandas数据库,它有一个包含数千个文档(每个索引行1个)的功能。在文档中,可以找到帐单代码。可以在文档中的任何位置找到这些实例(单个文档中的开始、结束、中间和多个实例)。它们以字母开头,后跟最多6个字符(通常是数字,有时是另一个字母)。我已经编制了一个可能的代码列表(这是一组行业范围的代码)。我的想法是使用类似于stopwords列表的代码列表。除非不排除代码,否则只保留代码。然后将它们附加到数据帧自己的列中,同时保持索引与原始数据帧相同。由于行业规定,我无法发布样本数据。我不能

我创建了一个pandas数据库,它有一个包含数千个文档(每个索引行1个)的功能。在文档中,可以找到帐单代码。可以在文档中的任何位置找到这些实例(单个文档中的开始、结束、中间和多个实例)。它们以字母开头,后跟最多6个字符(通常是数字,有时是另一个字母)。我已经编制了一个可能的代码列表(这是一组行业范围的代码)。我的想法是使用类似于stopwords列表的代码列表。除非不排除代码,否则只保留代码。然后将它们附加到数据帧自己的列中,同时保持索引与原始数据帧相同。由于行业规定,我无法发布样本数据。我不能肯定这是一个正则表达式问题,我对Python中的任何解决方案都持开放态度(最好)

示例文件:

blah blah blah code1 blah blah code(n) blah
预期数据帧结果:

1 |id# |Orignial Document |code1 code(n)|
2 |id#2|document 2        |code2 code(k)|
3 |id#3|document 3 blahs  |nan          |
代码列表:

[ code1, code2,..., code(n),...code(k)]
我取得了一些进展,我有以下代码

def match(input_string, icd_codes):
words = re.findall(r'\w+', input_string)
if [x for x in words if x in icd_codes]:
    return [x for x in words if x in icd_codes]
else: 
    return [np.NaN]
然后,当您运行该函数时

y= str(df['Diagnosis'])
df['ICD']= pd.Series(data=match(y,icd_codes))
df['ICD']
它输出

Code
Code2
Code
Code(n)
.
.
.
NaN
NaN
最终,我认为代码需要这样总结:

df['ICD']=df.Diagnosis.apply(lambda f: match(f,icd_codes))

它只提取了大约25个代码(太少了,似乎都来自最后30个文档),而且它们的索引也不适当。我很难弄清楚如何让它在整个文档列上运行,并将输出连接到一个新列中(同时保持索引的完整性)。如果“诊断”中索引为1的文档在文本中没有代码,我希望出现一个NaN或空白。然后,代码出现在新的列中,索引与此相同。通过使用df.iterrows()将文档传递到列表中,我能够提取更多的代码。但是,所描述的函数及其后续调用仍然忽略了保留原始索引完整性的需要。我在这个问题上陷入了困境。任何帮助都将不胜感激。

“我不确定这是一个正则表达式问题”-为什么不?对我来说,这正是一个正则表达式的工作。顺便说一句,你的“名单”是一套。一份清单必须用方括号括起来。我并没有像我应该做的那样精确。在我的代码中,它是方括号。另外,为了澄清,“废话”可以是任何东西,而不仅仅是重复相同的字符串。否则这将是难以置信的简单。我感谢您的编辑和加强正则表达式的使用。@StephenDeWolfe正如DyZ所问,为什么不使用正则表达式?我的意思是,如果有人有其他解决方案,我也愿意接受。