没有运气找到正则表达式模式python

我很难从正则表达式搜索中得到任何帮助。
我有一个看起来像这样的文本文件:

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~

我要提取以“ REF * 23 *”开头并以“〜”结尾的行。

txtfile = open(i + fileName,"r")
for line in txtfile:
    line = line.rstrip()
    p = re.findall(r'^REF*23*.+~',line)
    print(p)

但是,这没有给我任何帮助。我想用python深入研究正则表达式,因此我需要一种快速的解决方案。我最终想要的只是最后一个“ *”和“〜”谢谢之间的数字

lz0738 回答:没有运气找到正则表达式模式python

如果唯一的任务是提取以“ 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

大家都在问