Python正则表达式替换
嘿,我想找出一个正则表达式来执行以下操作 这是我的绳子Python正则表达式替换,python,regex,Python,Regex,嘿,我想找出一个正则表达式来执行以下操作 这是我的绳子 Place,08/09/2010,"15,531","2,909",650 我需要把这个字符串用逗号分开。虽然由于在数字数据字段中使用了逗号,但拆分无法正常工作。因此,我想在运行拆分字符串之前删除数字中的逗号 谢谢 如果您需要正则表达式解决方案,应该: >>> from StringIO import StringIO >>> import csv >>> r = csv.reader
Place,08/09/2010,"15,531","2,909",650
我需要把这个字符串用逗号分开。虽然由于在数字数据字段中使用了逗号,但拆分无法正常工作。因此,我想在运行拆分字符串之前删除数字中的逗号
谢谢 如果您需要正则表达式解决方案,应该:
>>> from StringIO import StringIO
>>> import csv
>>> r = csv.reader(StringIO('Place,08/09/2010,"15,531","2,909",650'))
>>> r.next()
['Place', '08/09/2010', '15,531', '2,909', '650']
r"(\d+),(?=\d\d\d)"
然后替换为:
"\1"
它会将字符串中任何位置的逗号分隔的数字替换为仅与之等效的数字,因此:
地点,2010年9月8日,“15531”,“548122909”,650
为此:
地点,2010年9月8日,“15531”,“548122909”,650
我确信还有一些漏洞需要找到,还有一些地方你不想这样做,这就是为什么你应该使用解析器
祝你好运 a=“”地点,2010年9月8日,“15531”、“2909”和“650”。拆分(“,”)
a = """Place,08/09/2010,"15,531","2,909",650""".split(',')
result = []
i=0
while i<len(a):
if not "\"" in a[i]:
result.append(a[i])
else:
string = a[i]
i+=1
while True:
string += ","+a[i]
if "\"" in a[i]:
break
i+=1
result.append(string)
i+=1
print result
结果=[]
i=0
而我直接使用regex的另一种方法是:
>>> import re
>>> data = "Place,08/09/2010,\"15,531\",\"2,909\",650"
>>> res = re.findall(r"(\w+),(\d{2}/\d{2}/\d{4}),\"([\d,]+)\",\"([\d,]+)\",(\d+)", data)
>>> res
[('Place', '08/09/2010', '15,531', '2,909', '650')]
这将用
替换引号中的,
,现在您可以使用字符串拆分方法 您可以使用以下方法解析该格式的字符串:
优点是只需几行就可以解析、转换和验证。请注意,整数都转换为整数,日期转换为日期时间结构 虽然我现在得到了这个错误回溯(最近一次调用是最后一次):,第19行,来自StringIO导入StringIO导入恐怖:Python 3中没有名为StringIO的模块,它是io.StringIO
:投票人敢告诉我为什么我的解决方案没有回答这个问题吗?问题很不清楚,但我认为它实际上是在问如何忽略双引号中的逗号(即,如何解析csv文件的一行),给出的示例只是一个简单的逗号拆分错误解析的示例。regexp在类似“10001234”的情况下失败,并且忽略双引号。不过,下落者不是我,所以我想这只是他或她的动机。建议使用csv模块的海报清楚地给出了正确的答案,我认为……除非数字是“123456789”
,否则它将是“123.456789”
,这一点很好,我只考虑了,是有效数字中的基数点的情况。谢谢,你的答案是我一直在寻找的正确答案。干杯@Ciarán小心不要在引号内有任何大于9999999
的数字…提供的表达式与“999999999”
完全不匹配-您需要一些具有环视功能的内容,例如:“(\d+),(?=\d\d(,\d\d\d)*”)
(应替换为“\1
)如果没有一个答案是合适的,你能指出你还缺少什么吗?
new_string = re.sub(r'"(\d+),(\d+)"', r'\1.\2', original_string)
import pyparsing as pp
import datetime as dt
st='Place,08/09/2010,"15,531","2,909",650'
def line_grammar():
integer=pp.Word(pp.nums).setParseAction(lambda s,l,t: [int(t[0])])
sep=pp.Suppress('/')
date=(integer+sep+integer+sep+integer).setParseAction(
lambda s,l,t: dt.date(t[2],t[1],t[0]))
comma=pp.Suppress(',')
quoted=pp.Regex(r'("|\').*?\1').setParseAction(
lambda s,l,t: [int(e) for e in t[0].strip('\'"').split(',')])
line=pp.Word(pp.alphas)+comma+date+comma+quoted+comma+quoted+comma+integer
return line
line=line_grammar()
print(line.parseString(st))
# ['Place', datetime.date(2010, 9, 8), 15, 531, 2, 909, 650]