【问题标题】:Need a regular expression to split String in Python [closed]需要一个正则表达式来在 Python 中拆分字符串 [关闭]
【发布时间】:2018-03-01 08:17:52
【问题描述】:
str = 'FW201703002082017MF0164EXESTBOPF01163500116000 0001201700258000580000116000.WALTERS BAY BOGAWANTALAWA 1M'

上面的表达式是需要拆分和提取的字符串,如下所示:

Borkername = FW
Sale year = 2017
Saleno = 0300
sale_dte = 20.08.2017 # date need to be format
Factoryno = MF0164
Catalogu code= EXEST
Grade =BOPF
Gross weight =01163.50 #decimal point needed
Net Weight = 01163.50 #decimal point needed
Lot_No = 0001
invoice_year = 2017
invoice_no = 00258
price = 000580.00 #decimal point needed
Netweight = 01160.00 #decimal point needed
Buyer = 'WALTERS BAY BOGAWANTALAWA'
Buyer_code = '1M'

这是没有任何分母的单行。所以,请帮我写一个正则表达式来将每个字段分隔到python中的熊猫列。

例如:

(\A[A-Z]{2}) 

这会给我前 2 个字符。我怎样才能得到接下来的 4 位数作为年份?

【问题讨论】:

  • 我在文本文件中有超过 10,000 条类似记录。
  • 您首先在键盘上输入...
  • 这不是 SO 的工作方式。您应该自己尝试一下,如果不起作用,您可以在这里寻求帮助。
  • 我知道要提取的每一列的确切位置,你能帮我根据字符串的长度来提取它们吗?
  • (\A[A-Z]{2}) 会给我前 2 个字符。如何获得接下来的 4 位数作为年份。

标签: python regex data-extraction


【解决方案1】:

您需要分两次执行此操作。首先使用正则表达式将字符串拆分为(大部分)固定长度的段。然后使用您返回的列表,手动将字段修复为您需要的格式。例如:

import re            
import csv

headings = [
    "Borkername", "Sale year", "Saleno", "sale_dte", "Factoryno", "Catalogu code", "Grade", "Gross weight", 
    "Net Weight", "Lot_No", "invoice_year", "invoice_no", "price", "Netweight", "Buyer", "Buyer_code"]

re_fields = re.compile(r'(.{2})(.{4})(.{3})(.{8})(.{6})(.{5})(.{4})(.{7})(.{7}) (.{4})(.{4})(.{5})(.{8})(.{7}).(.*?) (.{2})$')

with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_writer = csv.writer(f_output)
    csv_writer.writerow(headings)

    for line in f_input:
        fields = list(re_fields.match(line).groups())

        fields[3] = "{}.{}.{}".format(fields[3][:2], fields[3][2:4], fields[3][4:])
        fields[7] = float("{}.{}".format(fields[7][:5], fields[7][5:]))
        fields[8] = float("{}.{}".format(fields[8][:5], fields[8][5:]))
        fields[12] = float("{}.{}".format(fields[12][:6], fields[12][6:]))
        fields[13] = float("{}.{}".format(fields[13][:5], fields[13][5:]))

        csv_writer.writerow(fields)

这会给你output.csv 包含:

Borkername,Sale year,Saleno,sale_dte,Factoryno,Catalogu code,Grade,Gross weight,Net Weight,Lot_No,invoice_year,invoice_no,price,Netweight,Buyer,Buyer_code
FW,2017,030,02.08.2017,MF0164,EXEST,BOPF,1163.5,1160.0,0001,2017,00258,580.0,1160.0,WALTERS BAY BOGAWANTALAWA,1M

然后可以使用 Pandas 读入:

import pandas as pd

data = pd.read_csv('output.csv')
print data

这给出了:

  Borkername  Sale year  Saleno    sale_dte Factoryno Catalogu code Grade  Gross weight  Net Weight  Lot_No  \
0         FW       2017      30  02.08.2017    MF0164         EXEST  BOPF        1163.5      1160.0       1   
   invoice_year  invoice_no  price  Netweight                      Buyer Buyer_code  
0          2017         258  580.0     1160.0  WALTERS BAY BOGAWANTALAWA         1M

【讨论】:

  • Martin.,非常感谢您在这个问题上的帮助。这段代码运行良好。正如我前面提到的,文本文件中有超过 10,000 行类似的行。我的意图是将整组行导入熊猫数据框并迭代以提取必须显示为单独表列的属性。 import re import pandas as pd data = pd.read_csv(u'PUB05_FW_2017_AUG.txt', header=None) (这给了我一个 10000 x 1 矩阵)
  • 作为示例,我尝试从表中提取一个原始数据并提取特征。 strow = data[0:1:1].apply(str) # 由于 re_fields = re.match() 需要字符串,我尝试使用 df.iloc 将其转换为字符串[0].apply(str) 给了 # re_fields = re.match(r'(.{2})(.{4})(.{3})(. {8})(.{6})(.{5})(.{4})(.{7})(.{7}) (.{4})(.{4})(.{5 })(.{8})(.{7}).(.*?) (.{2})$', strow) 当我尝试执行上面的代码时,我遇到了错误,如下所述。错误:预期的字符串或类似字节的对象
  • 我建议您首先使用上述逻辑将源文本转换为适当的 CSV 文件,然后在 Pandas 中更容易处理。
  • 亲爱的 Martin,当我尝试使用正确的文本文件名执行此代码时,出现如下错误。回溯(最后一次调用):文件“”,第 3 行,在 csv_writer.writerow(headings) TypeError: a bytes-like object is required, not 'str'跨度>
  • 您可能正在使用 Python 3.x,我已经更新了脚本。这需要改变open('output.csv', 'w', newline='')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多