SSM*_*SMK 10 python regex string dataframe pandas
我有一个如下所示的数据框
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']})
Run Code Online (Sandbox Code Playgroud)
我想应用正则表达式并根据下面给出的规则创建两列
colval应该存储value:之前和之后的所有文本first hyphen
colAdm应该在之后存储所有文本third hyphen
我尝试了以下但它不能准确地工作
tdf['text_1'].str.findall('[.0-9]+\s*[mgMG/lLcCUNIT]+')
Run Code Online (Sandbox Code Playgroud)
Rav*_*h13 11
使用您显示的样本,您能否尝试以下操作。
tdf[["val", "Adm"]] = tdf["text_1"].str.extract(r'^value:\s?(\S+(?:\s[^-]+)?)(?:\s-\s.*?-([^-]*)(?:-.*)?)?$', expand=True)
tdf
Run Code Online (Sandbox Code Playgroud)
输出如下。
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
Run Code Online (Sandbox Code Playgroud)
说明:为以上添加详细说明。
^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.
Run Code Online (Sandbox Code Playgroud)
Series.str.extracttdf['text_1'].str.extract(r'^value:\s?([^-]+)(?:\s-.*?-\s)?([^-]*)(?:\s|$)')
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
正则表达式详细信息:
^ : 在行首断言位置value: : 匹配字符序列 value:\s?: 匹配零到一次之间的任何空白字符([^-]+): 第一个捕获组匹配除-一次或多次以外的任何字符(?:\s-.*?-\s)? : 0 和 1 次之间的非捕获组匹配
\s: 匹配单个空白字符- : 匹配字符 -.*? : 匹配零到无限次之间的任何字符,但尽可能少- : 匹配字符 -\s : 匹配单个空白字符([^-]*): 第二个捕获组匹配除-零次或多次以外的任何字符(?:\s|$) : 非捕获组
\s- : 匹配单个空白字符| : 或者切换$ : 断言行尾位置您可以使用
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
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。
详情:
^val:-val:在字符串的开头(如果val:不总是在字符串的开头,请删除^锚点)\s* - 零个或多个空格([^-]*?)- 第 1 组:除-尽可能少之外的任何字符(?:\s*-[^-]*-\s*(.*))? - 一个可选的序列
\s* - 零个或多个空格-[^-]*--一个-,任何零个或多个字符以外-,再一个-\s* - 零个或多个空格(.*) - 第 2 组:该行的其余部分$ - 字符串的结尾。