基于相同字符的不同位置将正则表达式应用于熊猫列
我有一个如下所示的数据框
tdf = pd.DataFrame({'text_1':['value: 1.25MG - OM - PO/TUBE - ashaf', 'value:2.5 MG - OM - PO/TUBE -test','value: 18 UNITS(S)','value: 850 MG - TDS AFTER FOOD - SC (SUBCUTANEOUS) -had', 'value: 75 MG - OM - PO/TUBE']})
我想应用正则表达式并根据下面给出的规则创建两列
colval应该存储value:之前和之后的所有文本first hyphen
colAdm应该在之后存储所有文本third hyphen
我尝试了以下但它不能准确地工作
tdf['text_1'].str.findall('[.0-9]+s*[mgMG/lLcCUNIT]+')
回答
使用您显示的样本,您能否尝试以下操作。
tdf[["val", "Adm"]] = tdf["text_1"].str.extract(r'^value:s?(S+(?:s[^-]+)?)(?:s-s.*?-([^-]*)(?:-.*)?)?$', expand=True)
tdf
上述正则表达式的在线演示
输出如下。
text_1 val Adm
0 value: 1.25MG - OM - PO/TUBE - ashaf 1.25MG PO/TUBE
1 value:2.5 MG - OM - PO/TUBE -test 2.5 MG PO/TUBE
2 value: 18 UNITS(S) 18 UNITS(S) NaN
3 value: 850 MG - TDS AFTER FOOD - SC (SUBCUTANEOUS) -had 850 MG SC (SUBCUTANEOUS)
4 value: 75 MG - OM - PO/TUBE 75 MG PO/TUBE
说明:为以上添加详细说明。
^value:s? ##Checking if value starts from value: space is optional here.
(S+ ##Starting 1st capturing group from here and matching all non space here.
(?:s[^-]+)? ##In a non-capturing group matching space till - comes keeping it optional.
) ##Closing 1st capturing group here.
(?:s-s.*?- ##In a non-capturing group matching space-space till - first occurrence.
([^-]*) ##Creating 2nd capturing group which has values till next - here.
(?:-.*)? ##In a non capturing group from - till end of value keeping it optional.
)?$ ##Closing non-capturing group at the end of the value here.
回答
Series.str.extract
tdf['text_1'].str.extract(r'^value:s?([^-]+)(?:s-.*?-s)?([^-]*)(?:s|$)')
0 1
0 1.25MG PO/TUBE
1 2.5 MG PO/TUBE
2 18 UNITS(S)
3 850 MG SC (SUBCUTANEOUS)
4 75 MG PO/TUBE
正则表达式详细信息:
^: 在行首断言位置value:: 匹配字符序列value:s?: 匹配零到一次之间的任何空白字符([^-]+): 第一个捕获组匹配除-一次或多次以外的任何字符(?:s-.*?-s)?: 0 和 1 次之间的非捕获组匹配s: 匹配单个空白字符-: 匹配字符-.*?: 匹配零到无限次之间的任何字符,但尽可能少-: 匹配字符-s: 匹配单个空白字符
([^-]*): 第二个捕获组匹配除-零次或多次以外的任何字符(?:s|$): 非捕获组s-: 匹配单个空白字符|: 或者切换$: 断言行尾位置
See the online Regex demo
回答
您可以使用
tdf[["val", "Adm"]] = tdf["text_1"].str.extract(r'^val:s*([^-]*?)(?:s*-[^-]*-s*(.*))?$', expand=True)
# => >>> tdf
text_1 val
0 val: 1.25MG - OM - PO/TUBE 1.25MG
1 val:2.5 MG - OM - PO/TUBE 2.5 MG
2 val: 18 UNITS(S) 18 UNITS(S)
3 val: 850 MG - TDS AFTER FOOD - SC (SUBCUTANEOUS) 850 MG
4 val: 75 MG - OM - PO/TUBE 75 MG
0 PO/TUBE
1 PO/TUBE
2 NaN
3 SC (SUBCUTANEOUS)
4 PO/TUBE
请参阅正则表达式演示。
详情:
^val:-val:在字符串的开头(如果val:不总是在字符串的开头,请删除^锚点)s*- 零个或多个空格([^-]*?)- 第 1 组:除-尽可能少之外的任何字符(?:s*-[^-]*-s*(.*))?- 一个可选的序列s*- 零个或多个空格-[^-]*--一个-,任何零个或多个字符以外-,再一个-s*- 零个或多个空格(.*)- 第 2 组:该行的其余部分
$- 字符串的结尾。