Python中用于重复字符串的正则表达式

2 投票
4 回答
8372 浏览
提问于 2025-04-16 09:44

我想要验证并解析这个字符串(在引号中的内容):

string = "start: c12354, c3456, 34526; other stuff that I don't care about"
//Note that some codes begin with 'c'

我想确认这个字符串是以'start:'开头,并且以';'结尾的。然后,我想用正则表达式来解析出字符串的内容。我试过以下的Python正则表达式代码:

regx = r"start: (c?[0-9]+,?)+;" 
reg = re.compile(regx)
matched = reg.search(string)
print ' matched.groups()', matched.groups()

我尝试了不同的变体,但我要么只能得到第一个代码,要么只能得到最后一个代码,但无法得到所有三个的列表。

或者我应该放弃使用正则表达式吗?

补充说明:更新了我之前忽略的部分问题,并修正了字符串的差异。感谢大家在这么短的时间内提供的建议。

4 个回答

2

这可以通过一个叫做 Pyparsing 的工具来做到,效果非常好:

from pyparsing import Group, Literal, Optional, Word
import string

code = Group(Optional(Literal("c"), default='') + Word(string.digits) + Optional(Literal(","), default=''))
parser = Literal("start:") + OneOrMore(code) + Literal(";")
# Read lines from file:
with open('lines.txt', 'r') as f:
    for line in f:
        try:
            result = parser.parseString(line)
            codes = [c[1] for c in result[1:-1]]
            # Do something with teh codez...
        except ParseException exc:
            # Oh noes: string doesn't match!
            continue

它比普通的正则表达式更简洁,返回的是一个代码的列表(不需要用 string.split 来分割),而且会忽略行中的多余字符,就像你举的例子那样。

5

你可以使用一些标准的字符串工具,这些工具通常更容易理解。

s = "start: c12354, c3456, 34526;"

s.startswith("start:") # 这个会返回一个布尔值,告诉你这个字符串是不是以"start:"开头

s.endswith(";") # 这个会返回一个布尔值,告诉你这个字符串是不是以";"结尾

s[6:-1].split(', ') # 这个会把字符串中从第7个字符到倒数第一个字符之间的内容,按照", "分开,给你一个列表

5

在Python中,想要用一个正则表达式来做到这一点是不可能的,因为每次捕获一个组的内容时,都会覆盖掉之前捕获的内容(在.NET中是可以的,因为它的引擎可以区分捕获和组)。

最简单的解决办法是提取出start:;之间的部分,然后再用正则表达式来返回所有匹配的结果,而不仅仅是一个匹配。你可以使用re.findall('c?[0-9]+', text)来实现这个功能。

撰写回答