在字符串中的特定单词之后找到数字(或字符)

时间:2019-02-27 20:01:57

标签: python regex pandas

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

( 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”怎么办?

1 个答案:

答案 0 :(得分:2)

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匹配字母数字字符和_