问题困扰了很长时间,希望能够得到高手的帮助。
问题:用正则表达式提取某一字段(纯文本)中的NIHSS评分,新建个字段放入。
提取内容:当文字中出现“NIHSS”时,后面因为书写习惯,会有不同数量的标点或文字,当第一次出现数字时,就是抓取的要点。
我目前的工作进度:
实例:
1、我的代码
def nihss(x):
nihss=re.findall(r"(?<=NIHSS).*?\d+\.?\d*",x["病程详情(日常)"])
return nihss
df["NIHSS"]=df.apply(nihss,axis=1)
2、被提取字段的内容示例
双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)
设想的提取结果:第一次:8;第二次:5
问题复述:就是把一段文字中的出现"HIHSS"后出现的第一个数字提取出来,在"HIHSS"后和数字之间可能会有不同的文字和标点符号,一段文字中可能有好几个NIHSS评分,谢谢。
如问题得到解决,可以商定一定的酬劳作为补脑费用[face]qq:21.gif[/face]
import re
x = "双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)"
nihss=re.findall(r"NIHSS.*?(\d+\.?\d*)", x, re.S)
print(nihss) # ['8', '5']
# 如果需要转成数值类型
nihss = list(map(float,nihss))
print(nihss) # [8.0, 5.0]
正则表达式编写如下:
import re
a = ""双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8分,2019年3月,NIHSS住院评分得566分,。辅助检查:颅脑CT(2019-04-07) NIHSS, something, 239898"
nihss = re.findall(r"NIHSS[^\d]*(\d+)", a)
原理是用[^\d]*匹配紧跟着NIHSS之后非数字的一串连续值,接下来匹配(\d+)多个数字。
在ipython里面做了一个简单的测试:
我看题主还有一个pandas.DataFrame的表格 ,对于dataFrame做修改,可以这样做。
def nihss(x):
nihss = re.findall(r"NIHSS[^\d]*(\d+)", x)
nihss = [int(x) for x in nihss]
return nihss
df["NIHSS"]=df["病程详情(日常)"].apply(nihss)
ps:现在医生也要用python了吗,老兄好猛……
想了一下,这个不用re反而简单
import re
prefix='NIHSS'
def nihss(x):
indexNow=x.find(prefix)
result=[]
while indexNow:
print("indexNow is ",indexNow)
i=indexNow+len(prefix)
while i<len(x):
if x[i].isdigit():
if (i+1)<len(x):
if x[i+1].isdigit():
result.append(x[i]+x[i+1])
break
result.append(x[i])
break
i=i+1
indexNow=x.find(prefix,indexNow+len(prefix))
print("indexNow update is ",indexNow)
if indexNow==-1:
break
return result
test=u'2019年1月,NIHSS评分:18分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07),NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)'
print(nihss(test))
#p1 = re.compile(r"(?<=NIHSS).*?", re.S)
#print(re.findall(p1, test))
#print(test)
以上考虑了有两位数评分的可能性代码运行结果如下:
indexNow is 8
indexNow update is 28
indexNow is 28
indexNow update is 64
indexNow is 64
indexNow update is -1
['18', '5', '5']
感觉这样写就可以吧?
>>> import re
>>> p = re.compile(r'NIHSS\D*(\d*)')
>>> s = '双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)'
>>> p.findall(s)
['8', '5']
>>> s = '双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8888分,2019年3月,NIHSS住院评分得15分,。辅助检查:颅脑CT(2019-04-07)'
>>> p.findall(s)
['8888', '15']
##楼主大气,这题简单
import re
s='双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性,双侧Hoffman征阴性,余查体未能配合。2019年1月,NIHSS评分:8分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)'
res=re.findall('NIHSS.*?(\d+)',s,re.S)
print(res)
测试用例有点少。给多点测试用例。
import re
test=u'2019年1月,NIHSS评分:18分,2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07),NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07)'
p1 = re.compile(r"(?<=NIHSS)(.*?)分[得:](.*?)分", re.S)
print(re.findall(p1, test))
print(re.findall(p1, test)[0][1])
import re nihss = ''' 双侧肱二头肌反射、肱三头肌反射对称存在,双侧膝反射、 踝反射消失,双侧Babinski征阴性,双侧Chaddock征阴性, 双侧Hoffman征阴性,余查体未能配合。 NIHSS住院评dfdfs分得asda6a分2019年1月,NIHSS评分:8分, 2019年3月,NIHSS住院评分得5分,。辅助检查:颅脑CT(2019-04-07) ''' print(re.findall(r'NIHSS.*?([0-9])[分|a]', nihss, re.S))
运行结果:['6', '8', '5']
关键看有没有10分的,两位数会麻烦
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
def nihss(x):
nihss=re.findall('NIHSS.*?(\d+)',x,re.S)
return nihss
df["NIHSS"]=df['你的纯文本字段名'].apply(nihss)
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y