用于数字(包括十进制和斜杠)的正则表达式

2024-04-29 08:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个字符串:

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

我也想针对这些案例


Tags: 字符串relenifpdf数字templogbook
3条回答

有了您展示的样本,您可以试试下面的正则表达式吗

假设以下是值:

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.

尝试:

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:更新正则表达式以接受第一个不带斜杠的值/

我认为在两个以上的空格上拆分并在以后使用相应的部分更容易:

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
-

相关问题 更多 >