如何从字符串中提取数值

本文介绍了一种从包含非数值字符的字符串中提取数值的算法,并提供了多种实现方式,包括使用Pascal语言的Val函数、字符串操作等方法。文章详细解释了每种方法的原理和使用场景,旨在帮助开发者高效地处理字符串解析任务。
  如何从字符串中提取数值,比如从'-10(16Mn)'中提取10这个数值,当然在字符串中'-'后面
  的数值长度不定,而( )中的字符串长度也不定。
  来个循环比较看看,条件是:IN(0..9)
  str := 'abc056'
  s:='';
  for i:=1 to length(str) do
  begin
  if str[i] in ['0'..'9'] then
  s:=s+str[i];
  end;
  http://zhidao.baidu.com/question/210744264.html
  pos 加for应该可以提取出来
  var s1:string;
  i:integer;
  begin
  s1:='-10(16Mn)';
  i:=pos('-',s1);
  s1:=copy(s1,i+1,length(s1)-i);
  i:=pos('(',s1);
  s1:=copy(s1,1,i-1);//这时s1中就是'10'这个字符串了
  end;
  terry_lzs的方法思路是对的,不过不必过滤负号.
  Result := StrToInt(Copy(S, 1, Pos('(', S) - 1);
  如果不知道是用'('分隔的话会麻烦些:
  b := True;
  while b do
  try
  X := StrToInt(S);
  b := False;
  except
  S := Copy(S, 1, Length(S) - 1);
  end;
  第二个算法有点问题,改一下:
  b := True;
  while b do
  try
  X := StrToInt(S);
  b := False;
  except
  if Length(S) = 0 then Break
  else
  S := Copy(S, 1, Length(S) - 1);
  end;
  var
  ss:string;
  i:integer;
  begin
  i:=pos('10','-10(16Mn)');
  label1.Caption:=copy('-10(16Mn)',i,2);
  end;
  上面各位的方法都可以,但我想大家可能都忽视了一个从Pascal继承下来,但现在很少用
  的函数Val,请看下面的程序
  var
  s: String;
  Code: Integer;
  Value: Real;
  begin
  s := 'ABc-10.22E2(a';
  repeat
  Val(s, Value, Code);
  case Code of
  0: //转换成功
  ShowMessage(FloatToStr(Value));
  1: //开头有非法字符
  Delete(s, 1, 1);
  else //末尾有非法字符
  Delete(s, Code, Length(s));
  end;
  until (Code = 0) or (Length(s) = 0);
  end;
  这段程序的优点在于,它不但对于检测整数有效,检测浮点数同样有效。
  http://www.itdelphi.com/delphibbs/doc/2001/524238. htm
  多谢各位帮助
### 使用 Python 提取字符串中的数值 在 Python 中,可以从字符串提取数值的方法有多种。以下是几种常见的方法及其实现方式: #### 方法一:正则表达式 (re 模块) 通过 `re` 模块可以轻松匹配并提取字符串中的数字部分。 ```python import re text = "The price is $123.45 and the quantity is 67." numbers = re.findall(r'\d+\.\d+|\d+', text) # 匹配整数和浮点数 print(numbers) # 输出 ['123.45', '67'] ``` 这种方法利用了正则表达式的强大功能来识别各种形式的数字[^1]。 --- #### 方法二:字符串分割与过滤 如果不需要复杂的模式匹配,可以通过简单的字符串操作完成任务。 ```python text = "There are 10 apples and 20 oranges" parts = text.split() numbers = [part for part in parts if part.isdigit()] print(numbers) # 输出 ['10', '20'] ``` 此方法适用于仅需提取整数的情况,并且输入数据较为简单时有效[^2]。 --- #### 方法三:结合 Pandas 处理复杂结构化数据 当处理更复杂的表格或文本数据时,Pandas 是一种高效工具。例如,从 DataFrame 的某一列中提取所有数字。 ```python import pandas as pd data = {'description': ["Item costs $123", "Discount of 10%", "Total due: 234"]} df = pd.DataFrame(data) extracted_numbers = df['description'].str.extractall(r'(\d+)').astype(int).unstack()[0] print(extracted_numbers) # 输出 Series 类型的结果 ``` 这里展示了如何使用 Pandas 和正则表达式相结合的方式提取嵌套于描述字段内的数字[^3]。 --- #### 性能对比分析 对于大规模数据分析场景下推荐采用矢量化运算(如 NumPy/Pandas),而对于小型项目或者脚本编写来说,则优先考虑简洁性和可读性的解决方案比如纯 python 实现或是引入轻量级库支持。 ```python def benchmark(): import timeit setup_code = """ import re text = "Sample with values like 123, 456.789 and some more digits such as 9876" """ stmt_re = """re.findall(r'\d+\.\d+|\d+', text)""" stmt_split_filter = """[t for t in text.split() if any(c.isdigit() for c in t)]""" timing_re = min(timeit.repeat(setup=setup_code, stmt=stmt_re, number=1000)) timing_split_filter = min(timeit.repeat(setup=setup_code, stmt=stmt_split_filter, number=1000)) return {"Regex":timing_re,"Split & Filter":timing_split_filter} results = benchmark() for k,v in results.items(): print(f"{k}: {v:.6f} seconds") ``` 上述代码片段用于比较不同技术路线下的执行效率差异情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值