regex 正则表达式检测双精度或整型[重复]

j2cgzkjk  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(104)

此问题已在此处有答案

re.findall behaves weird(3个答案)
3天前关闭。
这篇文章是编辑并提交审查2天前.
我试图编写一个机器人程序来检测字符串中的给定部分,一个字母和一个数字,数字可以是一个int或一个double,这个正则表达式是什么?我看到过类似的问题,但是**两个正则表达式代码实际上都不能检测到其中一个,它们总是被双精度数打断。
我试过"?(?=\d+\.\d+)\d+\.\d+|\d+) "\\d+(\\.\\d+)?,但它失败了。

import re

a = 'w2.2'
seconds = re.findall("\\d+(\\.\\d+)?"), a)
a = re.sub('[^a-zA-Z]+', '', a)
wnrlj8wa

wnrlj8wa1#

  • "...我试过"?(?=\d+\.\d+)\d+\.\d+|\d+) "\\d+(\\.\\d+)?,但失败了。..."*

你的第一个模式是无效的,而你的第二个模式是正确的,至少对于数字部分是正确的。
?是一个量词,它仅用于表示前面元素的数量。
因此,初始值?在这里是不必要的。
此外,括号不平衡-缺少一个左括号
(?= )语法是一个 look-around 组,在本例中,这是不必要的。
Wikipedia提供了关于 * 正则表达式模式 * 语法的优秀文档。

  • 维基百科-正则表达式-语法 *。
  • "...从字符串、字母和数字中检测给定部分,数字可以是int或double..."*

在第二种模式中,不需要捕获组。
你可以使用一个 * 非捕获组 *,语法是,(?: )

\d+(?:\.\d+)?

最后的模式如下。

[a-zA-Z]\d+(?:\.\d+)?

此外,您应该使用r说明符来表示 Python 字符串。
这被称为 raw string,允许您提供非转义的转义字符。

  • Python 3.11.4文档- 2.4.1。字符串和字节文字 *。
  • "...字符串和字节文字可以可选地以字母'r''R'作为前缀;这样的字符串被称为原始字符串,并且将反斜杠视为文字字符。..."*

此外,您可以使用 re.finditer 函数返回匹配值的集合。

string = 'w2.2'
for match in re.finditer(r'[a-zA-Z]\d+(?:\.\d+)?', string):
    print(match.group())

输出量

w2.2

下面是一个例子,有多个匹配项。

string = 'abc 123 a1 def b2.3 456 ghi c45.67'
for match in re.finditer(r'[a-zA-Z]\d+(?:\.\d+)?', string):
    print(match.group())

输出量

a1
b2.3
c45.67
yhqotfr8

yhqotfr82#

看看这个

[a-zA-Z]\d+(\.\d+)?
  • [a-zA-Z]:匹配任意大写或小写字母
  • \d+:匹配一个或多个数字
  • (\.\d+)?:匹配一个可选的小数点,后跟一个或多个数字

让我给予你一个例子,它将返回一个列表,其中包含在输入字符串中找到的所有匹配项

import re

text = 'w2.2'
pattern = '[a-zA-Z]\d+(\.\d+)?'

matches = re.findall(pattern, text)
print(matches)

结果:

['w2.2']
o7jaxewo

o7jaxewo3#

要匹配后跟整数或双精度型的字母,可以按如下方式修改正则表达式模式:

import re

a = 'w2.2'
matches = re.findall(r'[a-zA-Z]\d+\.?\d*|[a-zA-Z]\.\d+', a)

在这个正则表达式模式中:

  • [a-zA-Z]:此部分匹配单个字母字符(大写或小写)。
  • \d+匹配一个或多个数字。
  • \.?匹配可选的点。
  • \d*匹配点后的零个或多个数字。
  • |这是逻辑OR运算符,允许匹配它之前或之后的模式。
  • [a-zA-Z]\.\d+此部分匹配一个字母字符,后跟一个点字符和一个或多个数字。

此模式将正确匹配整数和双精度数。
关于代码中的re.sub行,似乎您正在从字符串a中删除所有非字母字符。如果这是你想要的行为,代码应该是:

a = re.sub('[^a-zA-Z]+', '', a)

相关问题