在熊猫文本列中的两个字符串之间查找一个字符串的多次出现

时间:2019-06-13 15:56:17

标签: python regex string pandas string-search

我有一个带有一个文本列的数据框。示例之一如下-

line = 'user : hi\nassistant : hi , good evening. how can i help you?\n \n \nuser : order status\nassistant : please enter your case id here. \n \nuser : 0023201. \nassistant : order number: 0023201 \norder amount: 22.5 USD \nplace: oregon \nuser : order status\nassistant : please enter your case id here. \n \nuser : 0023210. \nassistant : order number: 0023210 \norder amount: 18.5 USD \nplace: iowa \n \n'

我想将pf订单号,订单金额和位置信息提取到三个单独的列中。像这样-

df = pd.DataFrame([['some info','some info','text_column',['0023201','0023210'],['22.5','18.5'],['USD','USD'],['oregon','iowa']]], columns=['col1','col2','col3','col4','col5','col6','col7'])

我尝试使用're'模块,但是不能做很多事情。

str1 = 'number:'
str2 = 'amount:'
t2 = []
for i in data['text_column']:
    text = i
    reg = "(?<=%s).*?(?=%s)" % (str1,str2)
    r = re.compile(reg,re.DOTALL)
    result = r.findall(r,text)
    t2.append(result)

由于我是python新手,请提供帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用

(?s)user\s*:\s*(\d{7}).*?order amount:\s*(\d[\d.,]*) *([A-Z]+).*?place:\s*([^\r\n]+)

请参见regex demo

详细信息

  • (?s)-DOTALL修饰符,可让.跨行匹配
  • user-文字字符串
  • \s*:\s*-:内含0+空格
  • (\d{7})-组1 :七位数
  • .*?-直到第一个文本为止的任何文本...
  • order amount:-文字
  • \s*-超过0个空格
  • (\d[\d.,]*)-第2组:一个数字,然后是0+个数字,逗号或点
  • *-0个或更多空格
  • ([A-Z]+)-第3组:1个以上大写字母
  • .*?-直到第一个文本为止的任何文本...
  • place:-子字符串
  • \s*-超过0个空格
  • ([^\r\n]+)-第4组:除LF / CR以外的任意1个以上的字符