在Python中使用Regex进行搜索

时间:2014-11-05 11:26:17

标签: python regex

我很难理解Python中的正则表达式。

else:
    #REGEX1
    ret = re.search(r'name:(?P<scname>)',line) 
    if(ret != None):
        print('The  name is'+ret.group("scname"))
    else:
    #REGEX2
    ret = re.search(r'(?P<content>)',line)
    print('The content is'+ret.group("content"))

我正在使用以下内容解析文本文件

name:english
1001Nights 
A Night at the Call Center
Grammar
name:science
Engineering
Biology
Physics
name:maths
Algebra
Geometry

我希望输出为

这个名字是英文的 内容为1001晚 内容为呼叫中心的夜晚 内容为语法
这个名字是科学的 内容为工程
内容是生物学

请帮我纠正我的正则表达式并建议任何更容易理解正则表达式的链接。 由于我是Python的新手,官方文档感觉有点压倒性。

更新

这是我得到的错误,如果它有帮助

The subclient name is
Traceback (most recent call last):
  File "create&&bkp.py", line 32, in <module>
    print('The subclient name is'+ret.group("scname"))
IndexError: no such group

4 个答案:

答案 0 :(得分:2)

ret = re.search(r'name:(?P<scname>)',line) 

这将在行中的某个位置搜索'name:'(不一定在开头),如果找到,则在冒号后的位置生成一个匹配对象。由于&gt;之间没有任何内容。并且),该组为空,但它的名称为scname。因此,您显示的代码段与错误不匹配。其他不匹配包括在错误之前打印部分字符串以及单词&#34; subclient&#34;。

我会考虑简单的字符串处理:

for line in lines:
    line=line.rstrip('\n')    # assuming it came from a file, remove newline
    if line.startswith('name:'):
        print('The name is '+line[len('name:'):])
    else:
        print('The content is '+line)

也可以使用正则表达式进行整个分类:

matcher=re.compile(r'^(name:(?P<name>.*)|(?P<content>.*))$')
for line in lines:
    m=matcher.match(line)
    for key,value in m.groupdict():
        if value is not None:
            print('The {} is {}'.format(key,value))

答案 1 :(得分:1)

如果您的文件采用发布的格式,则不需要正则表达式:

with open("in.txt") as f:
    for line in f:
        if "name:" in line:
            print("The name is {}".format(line.rstrip().split("name:",1)[1]))
        else:
            print("The content is {}".format(line.rstrip()))

输出:

The name is english
The content is 1001Nights
The content is A Night at the Call Center
The content is Grammar
The name is science
The content is Engineering
The content is Biology
The content is Physics
The name is maths
The content is Algebra
The content is Geometry

答案 2 :(得分:0)

(?<=:)(.*)$

这将是你的regex1.See演示。

http://regex101.com/r/iZ9sO5/8

^(?!.*?:)(.*)$

这将是您的正则表达式2.参见演示。

http://regex101.com/r/iZ9sO5/9

答案 3 :(得分:0)

else:
    #REGEX1
    ret = re.search(r'name:(.*)$',line) 
    if(ret != None):
        print('The  name is'+ret.group(1))
    else:
        #REGEX2
        # ret = re.search(r'(?P<content>)',line)
        print('The content is'+line))