【问题标题】:Regular Expression in Python 3Python 3 中的正则表达式
【发布时间】:2017-04-12 16:34:04
【问题描述】:

我是新来的,刚开始在我的 python 代码中使用正则表达式。我有一个字符串,里面有 6 个逗号。其中一个逗号位于两个引号之间。我想去掉引号和最后一个逗号。

输入:

string = 'Fruits,Pear,Cherry,Apple,Orange,"Cherry,"'

我想要这个输出:

string = 'Fruits,Pear,Cherry,Apple,Orange,Cherry'         

我的代码输出:

string = 'Fruits,Pear,**CherryApple**,Orange,Cherry'

这是我在 python 中的代码:

if (re.search('"', string)):
    matches  = re.findall(r'\"(.+?)\"',string);
    matches1 = re.sub(",", "", matches[0]);
    string   = re.sub(matches[0],matches1,string);
    string   = re.sub('"','',string);

我的问题是,我想给出一个条件,即代码仅适用于最后一位(“Cherry”),但不幸的是它会影响中间的其他单词(Cherry,Apple),它与引号之间!这会减少逗号的数量(从 6 个到 4 个),因为它合并了两个字段(Cherry、Apple),我想留下 5 个逗号。

fullString = '2000-04-24 12:32:00.000,22186CBD0FDEAB049C60513341BA721B,0DDEB5,COMP,Ch‌​erry Corp.,DE,100,0.57,100,31213C678CC483768E1282A9D8CB524C,365.0‌​0000,business,acquis‌​itions-mergers,acqui‌​sition-bid,interest,‌​acquiree,fact,,,,,,,‌​,,,,,,acquisition-in‌​terest-acquiree,Cher‌​ry Corp. Gets Buyout Offer From Chairman President,FULL-ARTICLE,B5569E,Dow Jones Newswires,0.04,-0.18,0,0,1,0,0,0,0,1,1,5,RPA,DJ,DN2000042400‌​0597,"Cherry Corp. Gets Buyout Offer From Chairman President,"\n'

提前致谢

【问题讨论】:

  • 为什么只有 this 字符串需要处理?
  • 处理完fullString之后还需要放上你想要的输出

标签: python regex python-2.7 python-3.x


【解决方案1】:

对于您不需要正则表达式的任务,只需使用replace

string = 'Fruits,Pear,Cherry,Apple,Orange,"Cherry,"'
new_string = string.replace('"').strip(',')

【讨论】:

  • replace() 不需要两个参数吗?此外,strip() 甚至可能都不是必需的(例如'.replace(',"',',')[:-1])- 可能取决于字符串...
  • @Daniel:如果“Cherry”不是字符串的最后一个元素怎么办?
  • @Zryan "Cherry" 在这种情况下是无关紧要的。 strip(',') 将从字符串的开头或结尾删除任何 , 字符,因此类似:",,,this,is,a,test,,," 将变为 "this,is,a,test"
【解决方案2】:

最好的方法是使用支持(*SKIP)(*FAIL) 的较新的regex 模块:

import regex as re

string = 'Fruits,Pear,Cherry,Apple,Orange,"Cherry,"'

# parts
rx = re.compile(r'"[^"]+"(*SKIP)(*FAIL)|,')

def cleanse(match):
    rxi = re.compile(r'[",]+')
    return rxi.sub('', match)

parts = [cleanse(match) for match in rx.split(string)]
print(parts)
# ['Fruits', 'Pear', 'Cherry', 'Apple', 'Orange', 'Cherry']

在这里你匹配双引号之间的任何内容,然后把它扔掉,因此只有引号外的逗号用于拆分操作。其余的是带有清理功能的列表推导式。
a demo on regex101.com

【讨论】:

  • 谢谢 Jan,但我收到此错误消息:ImportError: No module named 'regex'
  • @Zryan:你需要先安装:pip install regex在控制台上。
  • 我没有权限在我的 uni pc 上安装正则表达式 :( 还有其他方法可以只使用 re 包吗?
  • @Zryan 尝试pip install regex --user 将其安装在您的用户配置文件目录下,无需特殊权限
【解决方案3】:

为什么不简单地使用这个:

>>>ans_string=string.replace('"','')[0:-1]

输出

>>>ans_string
'Fruits,Pear,Cherry,Apple,Orange,Cherry'

为了简单起见algorithmic complexity.

【讨论】:

  • 如果"Cherry," 不是字符串的最后一个元素怎么办?
  • @ABcDexter: 是的,如果不是最后呢?还有其他方法吗?
【解决方案4】:

您可以考虑使用csv module 来执行此操作。

例子:

import csv 
s='Fruits,Pear,Cherry,Apple,Orange,"Cherry,"'
>>> ','.join([e.replace(',','') for row in csv.reader([s]) for e in row])
Fruits,Pear,Cherry,Apple,Orange,Cherry

csv 模块将去掉引号,但在每个引用字段上保留逗号。然后,您可以删除保留的逗号。

这将逐个字段处理所需的任何修改(例如删除,)。带引号和逗号的字段可以是字符串中的任何字段。


如果你的内容在 csv 文件中,你会做这样的事情(在伪代码中)

with open(file, 'rb') as csv_fo:
   # modify(string) stands for what you want to do to each field...
   for row in csv.reader(csv_fo):
      new_row=[modify(field) for field in row]
      # now do what you need with that row

【讨论】:

  • 实际上,我必须阅读一个 csv 文件,其中一行看起来像我的简单问题,如果您不介意,我可以将整行发送给您?
  • 如果您实际上是在处理一个文件而不是一个字符串——一定要使用 csv 模块。只需发布文件几行的完整行示例,我将修改我的答案。
  • 感谢您的帮助,但您的代码正在减少字段数量,从而导致出现错误。
  • Fullstring ='2000-04-24 12:32:00.000,22186CBD0FDEAB049C60513341BA721B,0DDEB5,Comp,Cherry Corp.,DE,100,0.57,100,31213C678CCB524C,365.00000,Business,Accissition-Mergers,收购出价,利息,被收购方,事实,,,,,,,,,,,,,acquisition-interest-acquiree,Cherry Corp. 获得董事长总裁的收购要约,FULL-ARTICLE,B5569E,Dow Jones Newswires,0.04, -0.18,0,0,1,0,0,0,0,1,1,5,RPA,DJ,DN20000424000597,Cherry Corp. 获得董事长总裁的收购要约,\n'
  • 请将其放入您的问题中并包含所需的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多