【问题标题】:Regex find digits at the end of multiple strings正则表达式在多个字符串的末尾查找数字
【发布时间】:2021-05-19 00:36:46
【问题描述】:

下面是我的字符串,它来自标准输出。

我正在寻找一种方法来查找传感器的所有十进制数字。我想提供我的正则表达式模式“TP1”,并希望我的返回看起来像这样:

[156.2 , 30]

我正在使用 re.findall()

TP1   BCArc                                    156.2
TP2   Max: of output here                      0.01
TP3   some:other example 1 here                30.70
TP1   BCArc                                    30
TP2   Max: of output here                      2.22

我可以找到字符串的结尾,但不能通过输入找到:请参见此处:https://regex101.com/r/IyqtsL/1

这是我正在尝试的代码

\d+\.\d+?$

【问题讨论】:

  • 将您的正则表达式/代码放入问题本身是个好主意。如果 regex101 失败,那么这个问题对未来的访问者不再有价值。此外,链接中的测试字符串看起来不同——Th1c 而不是TP1?谢谢!
  • 在标志中启用多行模式
  • @JanWilamowski 你能解释一下如何做到这一点吗?
  • 我添加了完整的解释作为答案。
  • 您的问题被标记为 Python,但您只提供了一个非常基本的正则表达式 - 请分享您使用此正则表达式的 Python 代码,因为它会影响您需要的答案。

标签: python-3.x regex python-re


【解决方案1】:

通过标志启用多行模式:在 regex101.com 上,该选项在模式输入字段的右侧可用(默认情况下您可以看到 /g。在 Python 中使用正则表达式时,您可以将标志传递为第三个参数为re.findall()

import re

sensor = "TP1"
text = """
TP1   BCArc                                    156.2
TP2   Max: of output here                      0.01
TP3   some:other example 1 here                30.70
TP1   BCArc                                    30
TP2   Max: of output here                      2.22
"""
re.findall(fr'^{sensor}\s+\w+\s+([\d\.]+)$', text, re.MULTILINE)
# returns ['156.2', '30]

documentation 中描述了所有标志。

【讨论】:

  • OP 要求输出为 [156.2 , 30]。我认为这个问题还不是很清楚。 re.findall(r"^TP1.+?([\d.]+)$", text, re.MULTILINE) 可能是他们所追求的。
  • 是的,这并不能解决确切的问题。每条线都需要从感兴趣的传感器开始,这种情况是“TP​​1”。返回值应仅为 [156.2, 30]
  • 我更新了答案以包含和参数化感兴趣的传感器
  • @JanWilamowski 我会添加一个^ 以确保传感器位于生产线的开头。您可以将我建议的模式的全部或部分作为编辑,因为事实证明这是 OP 想要的。
  • 不,你的对我来说已经足够了。请注意,如果人们确实使用插值方法,则可能需要转义特殊的正则表达式字符以避免出现意外行为,例如传感器恰好是 "C++" 或引发re.error: multiple repeat at position 3 的类似内容。
【解决方案2】:

您也可以直接拆分文本。

给定:

txt = """\
TP1   BCArc                                    156.2
TP2   Max: of output here                      0.01
TP3   some:other example 1 here                30.70
TP1   BCArc                                    30
TP2   Max: of output here                      2.22
"""

你可以这样做:

>>> [sl[-1] for sl in (line.split() for line in txt.splitlines()) if sl[0]=='TP1']
['156.2', '30']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2013-10-30
    • 2017-02-14
    • 2021-01-04
    • 1970-01-01
    • 2011-02-25
    • 2018-06-18
    相关资源
    最近更新 更多