Chinaunix
标题:
正则表达式的问题
[打印本页]
作者:
wangcn
时间:
2008-06-05 17:08
标题:
正则表达式的问题
1.匹配mac地址。形如xx-xx-xx-xx-xx-xx或者xx:xx:xx:xx:xx:xx,分隔符要么是减号,要么是冒号,不得混用。我写了一个:(?:((?:(?:[0-9a-fA-F]{2})-){5})|((?:(?:[0-9a-fA-F]{2}):){5}))(?:[0-9a-fA-F]){2},有没有更好的写法。
2.匹配分组。比如:
import
re
pattern
=
r
'(?P<os>windows|Linux) (?P<ver>\d+)'
oss
=
'windows 3 Linux 4'
hd
=
re
.
compile
(
pattern
)
m
=
hd
.
search
(
oss
)
g
=
m
.
groupdict
(
)
print
g
只能返回{'os': 'windows', 'ver': '2003'}。怎么能返回所有的分组。
作者:
honglang13
时间:
2008-06-05 17:20
呵呵,,,
我的怎么只能返回
{'os': 'windows', 'ver': '3'}
作者:
wangcn
时间:
2008-06-05 17:24
原帖由
honglang13
于 2008-6-5 17:20 发表
呵呵,,,
我的怎么只能返回
{'os': 'windows', 'ver': '3'}
不好意思,是我写错了,是3。请问怎么能全部返回呢?
作者:
cobrawgl
时间:
2008-06-06 08:33
#!/usr/bin/perl
use strict;
use warnings;
# question 1
my $mac = 'dkk xx-xx-xx-xx-xx-xx dkk';
print "$1\n" if $mac =~ /((\w+[-:])+\w+)/;
# question 2
my $oss= 'windows 3 Linux 4';
my @os = map {s/(\w+)(\d)/os: $1 ver: $2/; $_;} ($oss =~ /(\w+ \d)/g);
print "$_\n" for @os;
复制代码
作者:
limodou
时间:
2008-06-06 15:26
因为search只能返回一次,所以只能返回第一个,使用finditer就可以了,我修改一下:
import re
pattern=r'(?P<os>windows|Linux) (?P<ver>\d+)'
oss='windows 3 Linux 4'
hd=re.compile(pattern)
for a in hd.finditer(oss):
print a.groupdict()
复制代码
作者:
wangcn
时间:
2008-06-06 22:54
谢谢limodou。
第一个问题有更好的解决方案吗?
[
本帖最后由 wangcn 于 2008-6-6 22:55 编辑
]
作者:
limodou
时间:
2008-06-07 10:33
想不出有太好了,你的方法应该就可以了。
作者:
baif
时间:
2008-06-07 22:49
[quote]原帖由
limodou
于 2008-6-6 15:26 发表
因为search只能返回一次,所以只能返回第一个,使用finditer就可以了,我修改一下:
import re
pattern=r'(?Pwindows|Linux) (?P\d+)'
oss='windows 3 Linux 4'
hd=re.compile(pattern)
for a in hd.f ... [/quote]
>>> pattern=r'(?P<os>windows|Linux) (?P<ver>\d+)'
>>> oss='windows 3 Linux 4'
>>> hd=re.compile(pattern)
>>> for a in hd.finditer(oss):
... print a.groupdict()
...
{'os': 'windows', 'ver': '3'}
{'os': 'Linux', 'ver': '4'}
>>> a = hd.findall(oss)
>>> print a
[('windows', '3'), ('Linux', '4')
复制代码
Maintain the named groups by yourself -_-b
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2