正则表达式请教

2015-07-27 06:04:51 +08:00
 soratadori
例子:
HAPPY: A,B,囧,5,6,7,d,e
p.s 冒号后面有空格 也可能是冒号前面有空格,然后大概有x个逗号(x+1个值)

问题:如何替换任意两个逗号中的值?

我试过用\1 \2来替换,在编辑器上这个功能可以用,但是在python里实现不了\1 \2会输出一个乱码。
我还试过用零宽断言(?!)或(?<=),但是好像这个方法不能接像是(.*?)这样的表达式,所以也失败了...
3161 次点击
所在节点    Python
16 条回复
iyangyuan
2015-07-27 08:42:47 +08:00
我觉得这种问题更适合用数据结构去解决。可以定义一个数组来存放所有的值,然后再用一个散列表,散列表中的key是数组中的每一个值,散列表的value是数组值所对应的下标数组(因为值可能重复,所以是数组),这样既可以快速检索某个值,又可以保持值的顺序,如果插入删除操作较多,可以用链表代替数组。
msg7086
2015-07-27 09:11:41 +08:00
bramblex
2015-07-27 09:19:55 +08:00
@msg7086

let me google that for you!/w\
amaranthf
2015-07-27 09:37:25 +08:00
python正则匹配之后的group是通过match object对象的group()函数来获取的,比如
amaranthf
2015-07-27 09:42:11 +08:00
晕,不小心多按了个键
p=re.compile(r'12(.*)34(.*)')
m=p.match('12abc34def')
m.group(1)=='abc'
m.group(2)=='def'
m.start(1)==2
m.end(1)==5
slideclick
2015-07-27 11:43:08 +08:00
你最好把你失败的正则表达式写上,这就跟code一样,拿嘴说不明白
henryon
2015-07-27 11:55:15 +08:00
source code/destination information. then we can help you.
vincenttone
2015-07-27 16:54:17 +08:00
re.compile(r'([^, :]),').findall('HAPPY: A,B,囧,5,6,7,d,e ')

楼主是这意思吗?前提是你后面的值里没有空格、逗号或者冒号。
vincenttone
2015-07-27 16:56:53 +08:00
re.compile(r'(?:[:\s,]{1}([^, :]))').findall('HAPPY: A,B,囧,5,6,7,d,e ')
漏了e
vincenttone
2015-07-27 16:57:27 +08:00
说实话,不如直接切割后split了
imn1
2015-07-27 17:44:19 +08:00
正则要记住多用 r‘规则’
因为没用 r 标记,所以\1 \2等被转义了(显示乱码)
soratadori
2015-07-28 06:52:22 +08:00
多谢@imn1 @msg7086 ,正则表达式确实是因为 r' '的问题。但还是没成功,貌似"\1"这样的形式后面跟不了数字,code [r'\1\2'+'123456'] ,如果把123456更换成其他的东西就可以运行。

谢@iyangyuan 和 @iyangyuan 提醒,我后来试了下用列表来解决这个问题:
L1 = ['key1','key2'……]
L2 = ['A','B','囧','5','6','7','d','e']
先查询L1里keyn的位置,再修改l2对应位置上的值,最后再输出L2回字符串是可行的。勉强算是解决这问题了。

但是感觉用列表来解决有点怪怪的,我又试了下用字典来弄,代码如下:
L1 = ['key1','key2'……]
L2 = ['A','B','囧','5','6','7','d','e']
D1 = dict(zip(L1,L2))
这样可以直接修改keyn的值(D1['keyn'] = ),而不用先查找keyn的位置再修改L2的值。但问题是,字典不会按照你设定的顺序(key1 key2……)排列-_-#,这样就没办法输出回字符串了。该怎么办?

@iyangyuan 我对这块不是很熟悉,你说的是上面这个意思吗?
soratadori
2015-07-28 06:56:00 +08:00
我正则表达式查找部分是写成这样的形式:
r'(happy.*?:)((.*?,){n})(.*?)(,)((.*?,){m})(.*?)(,.*)',然后\4和\8部分为需要的内容
msg7086
2015-07-28 07:05:06 +08:00
@soratadori 参照2楼的链接。我觉得已经说得很清楚了。
soratadori
2015-07-28 12:49:31 +08:00
@msg7086 多谢,已解决
PythonAnswer
2015-07-29 10:41:25 +08:00
In [1]:
# 字典实现

import re
from collections import OrderedDict

In [2]:
example = 'HAPPY: A,B,囧,5,6,7,d,e'

In [3]:
dict_values = re.sub(r'^.*\s*\:\s*', '', example).split(',')

In [4]:
dict_values

Out[4]:
['A', 'B', '囧', '5', '6', '7', 'd', 'e']

In [5]:
OrderedDict(zip(range(len(dict_values)), dict_values))

Out[5]:
OrderedDict([(0, 'A'), (1, 'B'), (2, '囧'), (3, '5'), (4, '6'), (5, '7'), (6, 'd'), (7, 'e')])

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208538

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX