基于相同字符的不同位置将正则表达式应用于熊猫列

我有一个如下所示的数据框

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 组:该行的其余部分
  • $ - 字符串的结尾。

以上是基于相同字符的不同位置将正则表达式应用于熊猫列的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>