由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - Python问题请教
相关主题
python regexp question (转载)安装Gnuplot和GMV的问题
emacs paste transpose 问题自己写的程序,程序参数应该放在哪个系统目录下面?
how to use regexp to extract this string pattern ?哪个发行不升级换代来着?
请教怎样截取文本中的一段明年一月份就可以申请新的domain了。例如。apple
grep + perl regular exprtmux 和emacs快捷键冲突
在emacs中怎么按照某种格式进行替换?无root权限就不能用apt-get这种包工具吧?
俺挖一个坑,大家谈谈超级计算机吧没有root权限怎么安装gcc (RHEL)
请问如何能让Qt(C++)中的浮点运算尽可能精确?using g1
相关话题的讨论汇总
话题: prefix话题: suffix话题: sed话题: input话题: regexp
进入Linux版参与讨论
1 (共1页)
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 的大作中提到】
: 感觉方括号不起什么用啊
相关主题
在emacs中怎么按照某种格式进行替换?安装Gnuplot和GMV的问题
俺挖一个坑,大家谈谈超级计算机吧自己写的程序,程序参数应该放在哪个系统目录下面?
请问如何能让Qt(C++)中的浮点运算尽可能精确?哪个发行不升级换代来着?
进入Linux版参与讨论
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里面可能出现数字的情况,所以不能用,看来还是要
: 回到我的老办法:(

相关主题
明年一月份就可以申请新的domain了。例如。apple没有root权限怎么安装gcc (RHEL)
tmux 和emacs快捷键冲突using g1
无root权限就不能用apt-get这种包工具吧?ubuntu8.04 input chinese?
进入Linux版参与讨论
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, 替换的内容用函数
: 返回就好了。这样你就可以省去繁琐的维护区间位置,拼接的麻烦。
: 框架都前面例子都帖了。虽然短,干的活比这个还要多。

1 (共1页)
进入Linux版参与讨论
相关主题
using g1grep + perl regular expr
ubuntu8.04 input chinese?在emacs中怎么按照某种格式进行替换?
how to enable Simplified Chinese input in ubuntu 9.04?俺挖一个坑,大家谈谈超级计算机吧
is there a shortcut for "expand all" in gmail?请问如何能让Qt(C++)中的浮点运算尽可能精确?
python regexp question (转载)安装Gnuplot和GMV的问题
emacs paste transpose 问题自己写的程序,程序参数应该放在哪个系统目录下面?
how to use regexp to extract this string pattern ?哪个发行不升级换代来着?
请教怎样截取文本中的一段明年一月份就可以申请新的domain了。例如。apple
相关话题的讨论汇总
话题: prefix话题: suffix话题: sed话题: input话题: regexp