如果唯一的任务是提取以“ REF * 23 *”开头并以“〜”结尾的行,则您实际上并不需要正则表达式:
results = []
with open(i + fileName,"r") as txtfile:
for line in txtfile:
line = line.rstrip()
if line.startswith('REF*23*') and line.endswith('~'):
results.append(line)
print(results)
如果需要获取数字块:
results = []
with open(i + fileName,"r") as txtfile:
for line in txtfile:
line = line.rstrip()
if line.startswith('REF*23*') and line.endswith('~'):
results.append(line[7:-1]) # Just grab the slice
请参见non-regex approach demo 。
注释
- 在正则表达式中,必须对
*
进行转义以匹配文字星号
- 您逐行阅读,
re.findall(r'^REF*23*.+~',line)
毫无意义,因为re.findall
方法用于在您期望的情况下获得多个匹配项
-
您的正则表达式未锚定在右侧,您需要$
或\Z
才能与行末的~
相匹配。因此,如果您想使用正则表达式,它看起来就像
m = re.search(r'^REF\*23\*(.*)~$',line):
if m:
results.append(m.group(1)) # To grab just the contents between delimiters
# or
results.append(line) # To get the whole line
See this Python demo
- 在您的情况下,您将搜索以固定文本开头和结尾的行,因此无需使用正则表达式。
编辑为评论的答案
另一个文本文件非常长,几乎没有空格。我需要找到一个节以REF*0F*
开头并以~
结尾的部分,中间是我想要的数字。
您可以逐行读取文件,并获取REF*0F*
和~
之间出现的所有1位以上的数字:
results = []
with open(fileName,"r") as txtfile:
for line in txtfile:
res = re.findall(r'REF\*0F\*(\d+)~',line)
if len(res):
results.extend(res)
print(results)
,
*
是正则表达式中的特殊字符,因此您必须按@The Third Bird指出的对其进行转义。您正在使用原始字符串,这意味着您不必从Python语言字符串解析中转义字符,但对于正则表达式引擎仍必须转义它。
r'^REF\*23\*.+~'
或
'^REF\\*23\\*.+~'
# '\\*' -> '\*' by Python string
# '\*' matches '*' literally by regex engine
将起作用。必须两次逃脱才能导致Leaning Toothpick Syndrome。使用原始字符串意味着您必须一次转义,在这方面“保存一些树”。
其他更改
如果要匹配组,您可能还想在.+
周围添加括号。除非您希望每行有多个匹配项,否则也将findall
更改为match
。
results = []
with open(i + fileName,"r") as txtfile:
line = line.rstrip()
p = re.match(r'^REF\*23\*(.+)~',line)
if p:
results.append(int(p.group(1)))
考虑使用正则表达式测试器,例如this one。
,
您可以完全使用字符串函数仅获取数字(尽管实际上,简单的正则表达式可能更易于理解):
raw = """
REF*0F*452574437~
REF*1L*627783972~
REF*23*526344060~
REF*6O*1024817112~
DTP*336*D8*20140623~
DTP*473*D8*20191001~
DTP*474*D8*20191031~
DTP*473*D8*20191101~
"""
result = [digits[:-1]
for line in raw.split("\n") if line.startswith("REF*23*") and line.endswith("~")
for splitted in [line.split("*")]
for digits in [splitted[-1]]]
print(result)
这产生
['526344060']
本文链接:https://www.f2er.com/3156834.html