Python 使用正则表达式更改字符串前面的数字

Python 使用正则表达式更改字符串前面的数字,python,regex,Python,Regex,我有一些文件有许多行,它们有两种格式之一: filename 8724.609 13204.0636961952836 8.8970 xjf ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 25.333 reb -chan 0 -subint 0 -snr 5.6939 在任何一种情况下,我都想用一个设定的数字(例如99.999)来更改紧跟在三个字母之前的数字(在这些情况下是“xjf”和“reb”) 我知道我可以用正

我有一些文件有许多行,它们有两种格式之一:

filename 8724.609 13204.0636961952836 8.8970 xjf

ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 25.333 reb  -chan 0 -subint 0 -snr 5.6939
在任何一种情况下,我都想用一个设定的数字(例如99.999)来更改紧跟在三个字母之前的数字(在这些情况下是“xjf”和“reb”)

我知道我可以用正则表达式来做这件事,我想我可以用如下的东西来代替这三个字母:

x=文件名8724.609 13204.0636961952836 8.8970 xjf

re.sub(r" [a-z]{3}", " abc", x)
但我不确定我如何改变三个字母前的数字

您可以使用

x = re.sub(r'\d+(?:\.\d+)?(?=\s+[a-z]{3}\b)', '99.999', x)
请参阅和:

详细信息

  • \d+
    -1+位
  • (?:\。\d+)
    -可选小数部分:
    和1+位
  • (?=\s+[a-z]{3}\b)
    -正向前瞻,需要1+个空格,三个小写ASCII字母,后跟单词边界,立即显示在当前位置的右侧
:

输出:

filename 8724.609 13204.0636961952836 99.999 xjf
ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 99.999 reb  -chan 0 -subint 0 -snr 5.6939
请尝试以下方法:

re.sub('[ ]?\d+(.\d+)? (?=[A-Za-z]{3}[ ]?)', ' 99.99 ', text)
要分解它: 我搜索具有以下内容的空格:

 [ ]?\d+(.)?\d+ 
然后使用先行断言搜索3个字符,可能以空格结尾,也可能不以空格结尾:

(?=[A-Za-z]{3}[ ]?

最后,sub将用您在本例中提供的值(99.99)替换此返回值。

您希望以何种方式更改这些数字?也许正则表达式不是适合您工作的工具。
[]?\d+(.\d+)?(?=[A-Za-z]{3}[]?)
regex匹配由3个以上字母组成的单词之前的数字,也可能匹配非数字,请参阅。为什么你接受了错误的解决方案?还是我把要求弄错了?用
123 abc
abc 1 def
(?=[A-Za-z]{3}[ ]?