我有以下文字:
2 HCl 12 Na 3(NaCl Cl₂)₂₄ → 2 NaCl H2
我想匹配每个分子,包括它的系数。下面的正则表达式几乎正常工作,但是空格字符,就在最后一次匹配之前,正在匹配,这不应该。这是我正在使用的正则表达式:
([0-9]*??\(*([a-z] [₀-₉]*) \)*[₀-₉]*))
如果您查看这个regex101链接,可能更容易了解我的问题是什么:https://regex101.com/r/hK7jY6/1
虽然维克多的回答非常丰富,但我想我可能已经找到了一种更简单的方法。
<代码>([0-9])*[a-z\(₀-₉\)]
据我所知,这将匹配等式的所有部分。
演示
使现代化
请看Wiktors更新的答案,它比这个好。
如果字符串只是有效的化学公式,为什么还要麻烦使用下标/数字/字母?有非空白符号。由于必须有一个强制字母或(),请在字符类[a-z(])中使用它们,然后附加(零个或多个非空白):
/(?:\d+ )?[a-z(]\S*/gi
请参阅正则表达式演示。(?:...)?
构造是一个可选的非捕获组(即仅用于分组但不捕获的组(=将子匹配存储在内存缓冲区中)。
您在开始时将数字和空格模式作为可选子模式,相反,您需要强制匹配它们,但将其放入可选组中:
(?:[0-9]+ )?\(*([a-z]+[₀-₉]*)+\)*[₀-₉]*
查看正则表达式演示
您的<代码>[0-9]* 变成了一个<代码>(?:[0-9]) 。请注意,这里您不必使用延迟版本的<代码> 量词,它的工作方式与贪婪的一样。我还删除了2个不必要的外部分组。
由于<代码>(?:[0-9]) 组是可选的,只有在前面有数字时才会匹配空格。如果没有数字,则可以匹配的下一个字符为零或更多(。然后,应该存在一个字母(如果没有(),字母将是匹配中的第一个字符)。
让我把它分解一下:
(?:[0-9] )?
-可选的一个或多个数字后跟空格
\(*
-零或更多(
(也许你是指?
) ([a-z] [₀-₉]*)
-一个或多个字母的零或多个序列后跟零或多个sbscript数字 \)*
-零或更多)
(也许你是指?
) [₀-₉]*
-零个或多个下标数字
如果您还想确保您不匹配
(Ca
或H)
,您还应该像这样拆分\(*...\)*
:
(?:[0-9]+ )?(?:(?:[a-z]+[₀-₉]*)+|\((?:[a-z]+[₀-₉]*)+\))[₀-₉]*
查看另一个演示
是否可以编写一个正则表达式,其中匹配1的最后一个符号是匹配2的开始符号?我喜欢匹配括号中的所有数字,并用管道隔开。情况也很复杂,因为比赛只能有一组深度。 这是我的字符串: 我想得到: 1234年 但是正则表达式应该不匹配: 我只找到了这个正则表达式{1}(\d)和这个问题,他还匹配了这样的文本(123 Text)。 我有一个关于regex101的例子:https://regex101.com/r/
我正在regex101上测试这个。通用域名格式 正则表达式: 测试字符串: 字符串匹配,但“匹配信息”框显示只有两个捕获组: 我期待着所有这些捕捉: β-bar baz-bz fd zz 为什么周期之间的每个标识符都没有被识别为自己捕获的组?
问题内容: 如何限制e004_n07中匹配/替换前导零?但是,如果任何一项包含全零,那么我需要在该项中保留一个零(请参见下面的示例)。对于输入字符串,第一个值将始终有3位数字,第二个值将始终有2位数字。 输入和输出示例 是否可以单独使用re.sub完成此操作,还是需要使用re.search/re.match? 问题答案: 如果只想在字母后删除零,则可以使用: 替换为反向引用。请参阅regex演示。
问题内容: 试图了解正则表达式,我在重复的部分:。 我有以下代码: 如您所见,两个字符串都不匹配该模式。为什么会这样呢? 问题答案: 您不应该在逗号后加空格,这是多余的。
null 应匹配“17个字母数字字符,连字符也可以,必须包括至少一个字母和至少一个数字” 它将正确匹配: 并正确拒绝匹配: null null
这个正则表达式什么意思?这里$1代表什么?