Python Regex以不同的方式相似数据并填充数据帧

Python Regex以不同的方式相似数据并填充数据帧,python,regex,pandas,Python,Regex,Pandas,我的信息块包含两个10个字符的字母数字代码,格式为xxxxx-xxxxx。下面的文本是如何呈现数据的示例。始终会有一个“父”号码和任意数量的“子”号码 修订版:23.4 12345-78901 a:a b:b { 54321-98765 a:a b:b } 12345-99999 a:a b:b { 54321-47382 a:a b:b 7test-38472 a:a b:b } 我们

我的信息块包含两个10个字符的字母数字代码,格式为
xxxxx-xxxxx
。下面的文本是如何呈现数据的示例。始终会有一个“父”号码和任意数量的“子”号码

修订版:23.4

12345-78901
    a:a
    b:b {
    54321-98765
    a:a
    b:b
}


12345-99999
    a:a
    b:b {
    54321-47382
    a:a
    b:b
    7test-38472
    a:a
    b:b
}
我们的想法是在一个捕获组中正则化第一个数字
12345-78901
,在另一个组中正则化第二个数字
54321-98765
,这样两个数字都不会出现在同一个正则化搜索中。我的想法是将两个不同的捕获组读入数据帧列。阅读以下文本后的结果如下:

Parent       Child
12345-78901  54321-98765
12345-99999  54321-47382
12345-99999  7test-38472
我陷入困境的是如何区分什么是父母,什么是孩子,我的方法是看缩进。代码如下:

df = pd.read_csv(txt, header=None, sep='\\', encoding = "ISO-8859-1")
numA = df[0].str.extractall(r'(.....-.....)')
numB = df[0].str.extractall(r'(    .....-.....)')
df_out = pd.concat([numA, numB], axis=1).reset_index(drop=True)

但是,这会将所有数字填充到
numA
中,并将
numB
留空,有什么提示吗?

您的问题是
r'(…-…)'
也与缩进的数字匹配。您可以通过指定行首的确切位置来避免这种情况。比如:

r'(^…-…)'
r'(^…-…)'


扬抑符
^
代表行的开头。如果您知道字符是数字,最好使用
\d
。所以类似于
r'(\d{5}-\d{5})
。对于扬抑符,必须设置pandas.Series.str.extractall的多行标志。

这是一种使用
str.findall

Ex:

s = """12345-78901
    a:a
    b:b {
    54321-98765
    a:a
    b:b
}
"""
s2 = """12345-99999
    a:a
    b:b {
    54321-47382
    a:a
    b:b
    7test-38472
    a:a
    b:b
}"""
df = pd.DataFrame({"temp":[s, s2]})
data = df["temp"].str.findall(r"(\w+\-\w+)").apply(lambda x: [{'Parent': x[0], "Child": i} for i in x[1:]]).tolist()
print(pd.DataFrame.from_records(np.concatenate(data)))
         Child       Parent
0  54321-98765  12345-78901
1  54321-47382  12345-99999
2  7test-38472  12345-99999
输出:

s = """12345-78901
    a:a
    b:b {
    54321-98765
    a:a
    b:b
}
"""
s2 = """12345-99999
    a:a
    b:b {
    54321-47382
    a:a
    b:b
    7test-38472
    a:a
    b:b
}"""
df = pd.DataFrame({"temp":[s, s2]})
data = df["temp"].str.findall(r"(\w+\-\w+)").apply(lambda x: [{'Parent': x[0], "Child": i} for i in x[1:]]).tolist()
print(pd.DataFrame.from_records(np.concatenate(data)))
         Child       Parent
0  54321-98765  12345-78901
1  54321-47382  12345-99999
2  7test-38472  12345-99999

由于某种原因,
数据
会被填充,但当试图将其连接到新的df或打印时,没有显示任何内容。我有点困惑,因为我看不到
r'(^…-…)'
r'(^…-…)'
之间的区别。第二个是空格。如果你标记它,你会看到空格。。。