我有一个名为
rasm_4_Becv0_0_1234_rasm_3exm
的字符串
我想提取 Becv
之后的数字,即 pysaprk 中的 0_0_1234
。
任何人都可以建议这个模式的正则表达式是什么吗? 数字正在变化。
此代码应该能够提取您正在寻找的模式。 我以以下形式添加了一些虚拟数据:
strings
-------------------------------
rasm_4_Becv0_0_1230_rasm_3exm
rasm_4_Becv0_0_1231_rasm_3exm
rasm_4_Becv0_0_1232_rasm_3exm
rasm_4_Becv0_0_1233_rasm_3exm
rasm_4_Becv0_0_123{i}_rasm_3exm
from pyspark.sql import Row
from pyspark.sql.types import StructType, StringType, StructField
from pyspark.sql import functions as f
# build the DataFrame
data = []
for i in range(5):
data.append(f"rasm_4_Becv0_0_123{i}_rasm_3exm")
df = spark.createDataFrame(data=[Row(x) for x in data], schema=StructType([StructField("strings", StringType(), True)]))
# extract the pattern
regex = r"(\d_\d_\d{4})"
group_idx = 1
df_new = df.withColumn("extracted_string", f.regexp_extract(f.col("strings"), regex, group_idx))
此模式与美元符号作为组提取器一样有效。所以 $1 表示组 1,$2 表示组 2,依此类推。
# extract the pattern
regex = r".*(\d_\d_\d{4}).*"
replacement = "$1"
df_new = df.withColumn("extracted_string", f.regexp_replace(f.col("strings"), regex, repl))