【问题标题】:Regex for numbers including decimal and slashes数字的正则表达式,包括小数和斜线
【发布时间】:2021-05-01 15:14:03
【问题描述】:

我有一个这样的字符串:

8 R-301 288/313 0.24 TT-2079 347.48

现在我想使用正则表达式提取 288/313 和 0.24 所以我写了这个:

r42=re.findall(r"8 +R-301.*",pdf[i])
if len(r42[0].split())>3:
  print(r42[0].split())
  logbook['R-301 Temp']=r42[0].split()[2]
  logbook['R-301 P']=r42[0].split()[3]

所以在理想情况下,数字出现在第二和第三索引中,我可以得到它。

但我面临的问题是,有时 288/313 有像 288 / 313 这样的空格,第二个数字 0.24 也可以有斜线,所以它可以像 0.24/0.25 或 0.24 /0.25。所以上面的正则表达式不起作用。

对于这些带有随机空格的十进制斜线数字,什么是理想的正则表达式?

注意:字符串的字符之间可以有多个空格。

编辑:

对不起,我在这里忘记了一个细节:

数字可以有 - 就像上面的例子一样,它可以是 -/313 而不是 288/313 或 - 而不是 0.24 或 0.24/- 或 -/0.24。

类似这样的:

8 R-301 288/- - TT-2079 347.48

我也想针对这些案例。

【问题讨论】:

  • 小注,只是为了澄清,\是反斜杠; / 是一个正斜杠(或只是一个斜杠)。

标签: python regex string


【解决方案1】:

对于您显示的示例,您能否尝试以下正则表达式。

假设以下是值:

var="""8 R-301 288/313 0.24/0.25 TT-2079 347.48
8 R-301 288 / 313 0.24/0.25 TT-2079 347.48
8 R-301 288 / 313 0.24 / 0.25 TT-2079 347.48
8 R-301 - / 313 -/ 0.25 TT-2079 347.48
8 R-301 288 /313 -/ 0.25 TT-2079 347.48
8 R-301 313 / - -/ 0.25 TT-2079 347.48
8 R-301 288 / 313 0.24/ 0.25 TT-2079 347.48
8 R-301 123/313 -/12123 TT-2079 347.48
8 R-301 123.12/31.23 -/12123 TT-2079 347.48
8 R-301 123/313 -/- TT-2079 347.48
8 R-301 123 12123 TT-2079 347.48
8 R-301 -/123 -/- TT-2079 347.48"""

下面是代码:

import re
val = re.findall(r'^\d+\s+R-\d+\s+(.*?)T.*',var,re.M)
for i in val:
   re.findall(r'((?:\d+(?:\.\d+)?|-)(?:(?:\s+)?\/(?:\s+)?(?:\d+(?:\.\d+)?|-))?)',i,re.M)

输出如下:

['288/313', '0.24/0.25']
['288 / 313', '0.24/0.25']
['288 / 313', '0.24 / 0.25']
['- / 313', '-/ 0.25']
['288 /313', '-/ 0.25']
['313 / -', '-/ 0.25']
['288 / 313', '0.24/ 0.25']
['123/313', '-/12123']
['123.12/31.23', '-/12123']
['123/313', '-/-']
['123', '12123']
['-/123', '-/-']

解释:为上述正则表达式添加详细解释:

(                               ##Creating 1st capturing group here.
 (?:\d+(?:\.\d+)?|-)            ##In a non-capturing group matching digits with optional dot digits OR followed by - here.
 (?:(?:\s+)?\/                  ##In a non-capturing group with optional spaces with / here.
 (?:\s+)?(?:\d+(?:\.\d+)?|-))?  ##Matching optional spaces with digits and optional digits OR with optional - here.
)                               ##Closing 1st capturing group here.

【讨论】:

  • 感谢您的回答,我犯了一个错误,没有添加细节,请您看看我所做的编辑
  • @WahabAftab,我已经更改了我的代码,并为您的问题假设了一些行示例,并试图涵盖所有情况;请查看链接regex101.com/r/aB2Skb/1 我已经在我的解决方案中发布了 Python 的代码,并告诉我它是怎么回事。
  • @RavinderSingh13 它适用于我测试过的几乎所有情况,除非它在第二位数字中没有小数点的情况下不起作用,例如 '8 R-301 123/313 -/ 12123 TT-2079 347.48' 这个想法是数字可以是浮点数,数字可以是 - 也可以是斜杠
  • @RavinderSingh13 成功了,非常感谢!
  • @WahabAftab,欢迎您,只是一个提示:从您未来的问题中,请添加您的输入和预期输出的详细示例,就像我在回答中添加的那样,这将有助于更好地理解问题,欢呼,快乐学习。
【解决方案2】:

试试:

import re

tests = [
    "8    R-301            288/313        0.24     TT-2079            347.48",
    "8    R-301            288 / 313        0.24     TT-2079            347.48",
    "8    R-301            288/313        0.24/0.25     TT-2079            347.48",
    "8    R-301            288/313        0.24/ 0.25     TT-2079            347.48",
    "8    R-301            288 / 313        0.24 / 0.25     TT-2079            347.48",
    "8    R-301            288/-        -     TT-2079            347.48",
    "8    R-301            288/-        0.1 /-     TT-2079            347.48",
    "8    R-301            -/233       -     TT-2079            347.48",
    "8 R-301 313 -/12123 TT-2079 347.48",
]

r = re.compile(
    r"\s+((?:[\d\.-]+\s*/\s*[\d\.-]+)|[\d\.-]+)\s+([\d\.-]+(?:\s*/\s*[\d\.-]+)?)"
)

for test in tests:
    m = r.search(test)
    if m:
        m = m.groups()
        number1 = m[0].replace(" ", "")
        number2 = m[1].replace(" ", "")
        print(number1, number2)

打印:

288/313 0.24
288/313 0.24
288/313 0.24/0.25
288/313 0.24/0.25
288/313 0.24/0.25
288/- -
288/- 0.1/-
-/233 -
313 -/12123

编辑:更新正则表达式以接受 - EDIT2:更新正则表达式以接受不带斜线的第一个值/

【讨论】:

  • 感谢您的回答,我犯了一个错误,没有添加细节,请您看看我所做的编辑
  • 谢谢你!我为我需要的一切工作,除了以下场景:“8 R-301 313 -/12123 TT-2079 347.48”,其中第一个数字没有斜线
【解决方案3】:

我认为 更容易分割两个以上的空间,然后使用相应的部分:

import re

tests = [
    "8    R-301            288/313        0.24     TT-2079            347.48",
    "8    R-301            288 / 313        0.24     TT-2079            347.48",
    "8    R-301            288/313        0.24/0.25     TT-2079            347.48",
    "8    R-301            288/313        0.24/ 0.25     TT-2079            347.48",
    "8    R-301            288 / 313        0.24 / 0.25     TT-2079            347.48",
    "8    R-301            288/-        -     TT-2079            347.48",
    "8    R-301            288/-        0.1 /-     TT-2079            347.48",
    "8    R-301            -/233       -     TT-2079            347.48",
]

rx = re.compile(r'\s{2,}')

for line in tests:
    parts = rx.split(line)
    print(parts[2])
    print(parts[3])

产量

288/313
0.24
288 / 313
0.24
288/313
0.24/0.25
288/313
0.24/ 0.25
288 / 313
0.24 / 0.25
288/-
-
288/-
0.1 /-
-/233
-

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多