【问题标题】:Locate numbers (or characters) after specific word in string在字符串中的特定单词之后找到数字(或字符)
【发布时间】:2019-02-27 20:01:57
【问题描述】:

我已经看到这个问题的变体被问了一百万次,但不知何故无法为自己找到解决方案。

( PIN  700W_start_stop( STS_PROP( POS_X 1233 )( POS_Y 456 )( BIT_CNT 1 )( CNCT_ID 7071869 ))(USR_PROP( VAR 1( Var_typ  -1 )(AssocCd H12 )( termLBLttt +S)( Anorm 011.1)(Amax 1.0))

如何提取“POS_X”后面的数字?即 1233 我以为我已经使用正则表达式弄清楚了,因为它看起来非常简单。但它不起作用(去图)。

import re
import pandas as pd

df_pin = pd.DataFrame(columns = 
['ID','Pos_x','Pos_y','conn_ID','Association_Code','Anorm','Amax'])

with open(r'C:\Users\user1\Documents\Python Scripts\test1.txt', 'r', 
encoding="ISO-8859-1") as txt:

    for line in txt:
        data = txt.read()
        line = line.strip()
        x = re.search(r'POS_X (\d+)', data)
        df_pin = df_pin.append({'POS_X' : x, ignore_index = True}
        print (x)

这不应该给我'POS_X'之后的数字,然后将它附加到我的数据框中的相应列吗?同一行可能出现多次'POS_X ###',我只想找到第一个。如果我想对“PIN”执行相同的操作并提取“700W_start_stop”怎么办?

【问题讨论】:

  • 你用data = txt.read()将整个文件读入data,并且在它之后不要对你的line做任何事情。
  • @WiktorStribiżew 这是不正确的吗?
  • 嗯,这没有任何意义。另外,缩进是错误的。
  • x.group(1) 将返回号码。

标签: python regex pandas


【解决方案1】:

re.search() 返回一个MatchObject 对象。 \d+被正则表达式中的第一个捕获组匹配,所以需要使用

if x:
    print(x.group(1))
else:
    print("POS_X not found")

打印出来。

DEMO

整个循环应该是:

import re
with open(r'C:\Users\user1\Documents\Python Scripts\test1.txt', 'r', encoding="ISO-8859-1") as txt:
    for line in txt:
        line = line.strip()
        x = re.search(r'POS_X (\d+)', line)
        if x:
            print(x.group(1))
        else:
            print("POS_X not found in", line)

对于PIN,您可以使用:

x = re.search(r'PIN (\w+)')

\w 匹配字母数字字符和_

【讨论】:

  • re.search() 的参数应该是 line,而不是 txt
  • 我回滚了您的编辑,因为当问题与我发布的代码相同时,我的回答毫无意义。
  • 如果你想展示你尝试过的东西,请将其添加到问题的末尾,不要删除原始代码。
  • 尝试把print(line)放在第一位,看看该行实际包含什么。
  • 您显示的字符串分布在多行中。文件中是这样的,还是只有一行?
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多