x*z 发帖数: 1010 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: xsz (第46个出口), 信区: Programming
标 题: Python问题请教
发信站: BBS 未名空间站 (Wed Oct 26 16:06:04 2011, 美东)
应该很简单,自己也能想出解决办法,但是肯定不是最优的,想找个
最优解。问题就是展开如下的range,变成一个sequence。
[0-3,4,8-9],13,[102-103,150],1000,...
-》
[0,1,2,3,4,8,9,13,102,103,150,1000,...]
我现在的想法就是先去匹配[],把[]全提出来后再按','去split,
然后再分别处理[]里面的内容,这样太复杂了,有什么简单办法么? | a9 发帖数: 21638 | 2 感觉方括号不起什么用啊
【在 x*z 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: xsz (第46个出口), 信区: Programming : 标 题: Python问题请教 : 发信站: BBS 未名空间站 (Wed Oct 26 16:06:04 2011, 美东) : 应该很简单,自己也能想出解决办法,但是肯定不是最优的,想找个 : 最优解。问题就是展开如下的range,变成一个sequence。 : [0-3,4,8-9],13,[102-103,150],1000,... : -》 : [0,1,2,3,4,8,9,13,102,103,150,1000,...] : 我现在的想法就是先去匹配[],把[]全提出来后再按','去split,
| S*A 发帖数: 7142 | 3 问题没有问好,输入是 list of list 还是 str?
要给好输入的数据类型才好讨论。
如果是 list 的话,参考 itertools.chain.from_iterable
【在 x*z 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: xsz (第46个出口), 信区: Programming : 标 题: Python问题请教 : 发信站: BBS 未名空间站 (Wed Oct 26 16:06:04 2011, 美东) : 应该很简单,自己也能想出解决办法,但是肯定不是最优的,想找个 : 最优解。问题就是展开如下的range,变成一个sequence。 : [0-3,4,8-9],13,[102-103,150],1000,... : -》 : [0,1,2,3,4,8,9,13,102,103,150,1000,...] : 我现在的想法就是先去匹配[],把[]全提出来后再按','去split,
| I*l 发帖数: 1649 | 4 same here...
【在 a9 的大作中提到】 : 感觉方括号不起什么用啊
| m********5 发帖数: 17667 | 5 他这么说split之类的明显是输入str嘛
【在 S*A 的大作中提到】 : 问题没有问好,输入是 list of list 还是 str? : 要给好输入的数据类型才好讨论。 : 如果是 list 的话,参考 itertools.chain.from_iterable
| L***n 发帖数: 6727 | 6 idea大概不错,我觉得没什么更简单的做法
【在 x*z 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: xsz (第46个出口), 信区: Programming : 标 题: Python问题请教 : 发信站: BBS 未名空间站 (Wed Oct 26 16:06:04 2011, 美东) : 应该很简单,自己也能想出解决办法,但是肯定不是最优的,想找个 : 最优解。问题就是展开如下的range,变成一个sequence。 : [0-3,4,8-9],13,[102-103,150],1000,... : -》 : [0,1,2,3,4,8,9,13,102,103,150,1000,...] : 我现在的想法就是先去匹配[],把[]全提出来后再按','去split,
| m********5 发帖数: 17667 | 7 你发现没?他那个[]完全是冗余
就是去掉了也没关系...
【在 L***n 的大作中提到】 : idea大概不错,我觉得没什么更简单的做法
| L***n 发帖数: 6727 | 8 输入是自己定义的么
【在 m********5 的大作中提到】 : 你发现没?他那个[]完全是冗余 : 就是去掉了也没关系...
| x*z 发帖数: 1010 | 9 str
【在 S*A 的大作中提到】 : 问题没有问好,输入是 list of list 还是 str? : 要给好输入的数据类型才好讨论。 : 如果是 list 的话,参考 itertools.chain.from_iterable
| x*z 发帖数: 1010 | 10 嗯,这其实是一个简化的模型,原型需要[]
input='r[0-3,9,11-13].abc, d23.def, ...'
【在 a9 的大作中提到】 : 感觉方括号不起什么用啊
| | | x*z 发帖数: 1010 | 11 嗯,想简化一下问题好提问,没考虑周全:)
【在 m********5 的大作中提到】 : 你发现没?他那个[]完全是冗余 : 就是去掉了也没关系...
| S*A 发帖数: 7142 | 12 string 就很容易了。随便 regexp 把数字就提出来就成了。 | x*z 发帖数: 1010 | 13 对啊,就是在请教这个regexp怎么写啊。按我的想法就得
两步,第一步先regexp去match [],然后再处理剩下的,
不过我python很弱,所以问问有没有什么好办法。
【在 S*A 的大作中提到】 : string 就很容易了。随便 regexp 把数字就提出来就成了。
| S*A 发帖数: 7142 | 14 都是正整数么? 有浮点和负数么?
re.findall(r'[-\d]+', input)
【在 x*z 的大作中提到】 : 对啊,就是在请教这个regexp怎么写啊。按我的想法就得 : 两步,第一步先regexp去match [],然后再处理剩下的, : 不过我python很弱,所以问问有没有什么好办法。
| L***n 发帖数: 6727 | 15 mo=re.compile(r'\[\d+-\d+\]', re.M).search(str)?
【在 x*z 的大作中提到】 : 对啊,就是在请教这个regexp怎么写啊。按我的想法就得 : 两步,第一步先regexp去match [],然后再处理剩下的, : 不过我python很弱,所以问问有没有什么好办法。
| S*A 发帖数: 7142 | 16 这个明显不对,不能 match 例子里的 103-105,
【在 L***n 的大作中提到】 : mo=re.compile(r'\[\d+-\d+\]', re.M).search(str)?
| L***n 发帖数: 6727 | 17 哦,忘了逗号了,那先把'['和']'变成''
再找'-'匹配吧
【在 S*A 的大作中提到】 : 这个明显不对,不能 match 例子里的 103-105,
| x*z 发帖数: 1010 | 18 这个明显不行啊,我前面已经加了补充说明了,[]不能省的,
因为还有prefix/suffix,原帖只是给了一个不正确的例子。
【在 L***n 的大作中提到】 : 哦,忘了逗号了,那先把'['和']'变成'' : 再找'-'匹配吧
| x*z 发帖数: 1010 | 19 都是正整数,没有浮点和负数。不过看来明显是我原帖问得不好。
input='r0[0-1,9,11-12].abc, d23.def'
result=['r00.abc', 'r01.abc', 'r09.abc', 'r11.abc', 'r12.abc', 'd23.def']
re.findall(r'[-\d]+', input)
这个解法忽略了prefix和suffix里面可能出现数字的情况,所以不能用,看来还是要
回到我的老办法:(
【在 S*A 的大作中提到】 : 都是正整数么? 有浮点和负数么? : re.findall(r'[-\d]+', input)
| S*A 发帖数: 7142 | 20 这个显然是要分两步的,你的 prefix 和 suffix 的边界条件是什么
也没有说明。编程要养成好习惯总是敲定边界条件是什么然后才好遍。
比较简洁的写法大概是:
def expand(m):
# expand one [] list
prefix,repeat,suffix = m.groups()
...
return expand_result
re.sub(r'([^,]*)\[([^\]])\]([^,]*)', expand, str)
【在 x*z 的大作中提到】 : 都是正整数,没有浮点和负数。不过看来明显是我原帖问得不好。 : input='r0[0-1,9,11-12].abc, d23.def' : result=['r00.abc', 'r01.abc', 'r09.abc', 'r11.abc', 'r12.abc', 'd23.def'] : re.findall(r'[-\d]+', input) : 这个解法忽略了prefix和suffix里面可能出现数字的情况,所以不能用,看来还是要 : 回到我的老办法:(
| | | x*z 发帖数: 1010 | 21 这个的边界条件很直观啊,就是转换到程序上比较麻烦,如果有[],
就把[]里的所有东西当一个整体处理,[]前后分别是prefix/suffix,
如果没有[],那就是一个整体,无所谓prefix/suffix,因为我只要
这个string就行。
比如上面的例子
input='r0[0-1,9,11-12].abc, d23.def'
这个就是两段,第一段'r0[0-1,9,11-12].abc',第二段'd23.def',
然后要对第一段[]内做展开,prefix='r0', suffix='.abc'。第二段
不需要处理,直接添加到最后结果就行。
[]内的展开部分我都写好了,但是前面分段还没想好怎么处理。
【在 S*A 的大作中提到】 : 这个显然是要分两步的,你的 prefix 和 suffix 的边界条件是什么 : 也没有说明。编程要养成好习惯总是敲定边界条件是什么然后才好遍。 : 比较简洁的写法大概是: : def expand(m): : # expand one [] list : prefix,repeat,suffix = m.groups() : ... : return expand_result : re.sub(r'([^,]*)\[([^\]])\]([^,]*)', expand, str)
| i*******l 发帖数: 9 | 22 写的有点繁,但貌似能用,抛砖引玉吧
import re
regexp = re.compile(r"([^\[\,]*)" # prefix
r"(\[((\d+|\d+\-\d+)(,(\d+|\d+\-\d+))*)\])*" # range
r"\." #dot
r"([^\[\,]*)" #suffix
)
input = 'r0[0-1,9,11-12].abc, d23.def'
start = 0
m=regexp.search(input[start:])
while m:
print(m.groups())
print('prefix',m.group(1))
print('range',m.group(2))
print('suffix',m.group(7))
start += m.end()+1
m=regexp.search(input[start:]) | S*A 发帖数: 7142 | 23 这个边界条件是 prefix/suffix 由什么东西字符组成是合法的。
例如 prefix/suffix 里面可不可以有 [] etc.
我给你的例子里的 re.sub 加上 replacement 的函数就是你想要的。
在 expand() 里面返回如何展开一个 prefix[...]suffix 就成了。
【在 x*z 的大作中提到】 : 这个的边界条件很直观啊,就是转换到程序上比较麻烦,如果有[], : 就把[]里的所有东西当一个整体处理,[]前后分别是prefix/suffix, : 如果没有[],那就是一个整体,无所谓prefix/suffix,因为我只要 : 这个string就行。 : 比如上面的例子 : input='r0[0-1,9,11-12].abc, d23.def' : 这个就是两段,第一段'r0[0-1,9,11-12].abc',第二段'd23.def', : 然后要对第一段[]内做展开,prefix='r0', suffix='.abc'。第二段 : 不需要处理,直接添加到最后结果就行。 : []内的展开部分我都写好了,但是前面分段还没想好怎么处理。
| x*z 发帖数: 1010 | 24 prefix是\w*, suffix是[\.\w]*,其他字符都是非法的。正在看re.sub(),
确实好像是我需要的,从来没用过re.sub(),貌似很高级的样子:),回头
有问题再请教。
【在 S*A 的大作中提到】 : 这个边界条件是 prefix/suffix 由什么东西字符组成是合法的。 : 例如 prefix/suffix 里面可不可以有 [] etc. : 我给你的例子里的 re.sub 加上 replacement 的函数就是你想要的。 : 在 expand() 里面返回如何展开一个 prefix[...]suffix 就成了。
| x*z 发帖数: 1010 | 25 嗯,谢谢,这也是一个思路,不过这个regexp有个小问题,唯一的判定点是要求'.',
这个不是一定的,比如'foo',我也需要它。如果把‘r"\." #dot’从re里拿掉,整个
regexp就不成立了。
【在 i*******l 的大作中提到】 : 写的有点繁,但貌似能用,抛砖引玉吧 : import re : regexp = re.compile(r"([^\[\,]*)" # prefix : r"(\[((\d+|\d+\-\d+)(,(\d+|\d+\-\d+))*)\])*" # range : r"\." #dot : r"([^\[\,]*)" #suffix : ) : input = 'r0[0-1,9,11-12].abc, d23.def' : start = 0 : m=regexp.search(input[start:])
| x**m 发帖数: 941 | 26 写了个很笨的script,大家看看怎么简化:
$ cat input.txt
[0-3,4,8-9],13,[102-103,150],1000
$ eval `cat input.txt | tr -d "[]" | sed "s/-/ /g" | sed 's/,[0-9]*,/& &/g'
| sed "s/,[0-9]*$/& &/g" | sed "s/, ,/ /g" | sed "s/ ,/ /g" | sed "s/,/; seq
/g" | sed "s/^/seq /g"`
0
1
2
3
4
8
9
13
102
103
150
1000 | S*A 发帖数: 7142 | 27 你这个是在用 python 从新实现 re.findall() 或者 re.finditer()
的功能,这个一行就搞定了,而且 re.findall 是用 C 写的,还快。
LZ 这里还要做替换,所以最好还是用 re.sub, 替换的内容用函数
返回就好了。这样你就可以省去繁琐的维护区间位置,拼接的麻烦。
框架都前面例子都帖了。虽然短,干的活比这个还要多。
【在 i*******l 的大作中提到】 : 写的有点繁,但貌似能用,抛砖引玉吧 : import re : regexp = re.compile(r"([^\[\,]*)" # prefix : r"(\[((\d+|\d+\-\d+)(,(\d+|\d+\-\d+))*)\])*" # range : r"\." #dot : r"([^\[\,]*)" #suffix : ) : input = 'r0[0-1,9,11-12].abc, d23.def' : start = 0 : m=regexp.search(input[start:])
| i*******l 发帖数: 9 | 28 没有那个‘r"\." #dot’也是可以用的,我以为你对prefix和suffix的定义是'.'前后
,所以加上了。
【在 x*z 的大作中提到】 : 嗯,谢谢,这也是一个思路,不过这个regexp有个小问题,唯一的判定点是要求'.', : 这个不是一定的,比如'foo',我也需要它。如果把‘r"\." #dot’从re里拿掉,整个 : regexp就不成立了。
| i*******l 发帖数: 9 | 29 嗯,受教了。研究了一下的确如此。
我贴那段代码的主要用意是给出一个能用的regex例子,因为很多时候看起来很简单的
应用最后的正则式会很繁琐复杂。底下那部分只是跑跑看是不是能用。
【在 S*A 的大作中提到】 : 你这个是在用 python 从新实现 re.findall() 或者 re.finditer() : 的功能,这个一行就搞定了,而且 re.findall 是用 C 写的,还快。 : LZ 这里还要做替换,所以最好还是用 re.sub, 替换的内容用函数 : 返回就好了。这样你就可以省去繁琐的维护区间位置,拼接的麻烦。 : 框架都前面例子都帖了。虽然短,干的活比这个还要多。
|
|