Python中用于重复字符串的正则表达式
我想要验证并解析这个字符串(在引号中的内容):
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)
来实现这个功能。