Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex java.lang.IndexOutOfBoundsException:无组1 | Pyspark_Regex_Pyspark - Fatal编程技术网

Regex java.lang.IndexOutOfBoundsException:无组1 | Pyspark

Regex java.lang.IndexOutOfBoundsException:无组1 | Pyspark,regex,pyspark,Regex,Pyspark,我试图使用带有Pyspark中以下脚本的正则表达式提取某些邮政编码的地区: postcodes.选择(“原始邮政编码”,regexp\u extract('raw\u postcode',”^[a-zA-Z]+\d\d?[a-zA-Z]?,1).别名(“区域”).显示(40,假) 我得到以下例外: Py4JJavaError: An error occurred while calling o562.showString. : org.apache.spark.SparkException: J

我试图使用带有Pyspark中以下脚本的正则表达式提取某些邮政编码的地区:

postcodes.选择(“原始邮政编码”,regexp\u extract('raw\u postcode',”^[a-zA-Z]+\d\d?[a-zA-Z]?,1).别名(“区域”).显示(40,假)

我得到以下例外:

Py4JJavaError: An error occurred while calling o562.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 17.0 failed 4 times, most recent failure: Lost task 0.3 in stage 17.0 (TID 44, ip-172-31-100-215.eu-west-1.compute.internal, executor 1): java.lang.IndexOutOfBoundsException: No group 1
    at java.util.regex.Matcher.group(Matcher.java:538)
我曾单独在Python中尝试过正则表达式,它可以工作,但在pyspark中它给我带来了麻烦。帮我找出原因。

试试下面的模式

^([a-zA-Z]+[0-9]{1,2}[a-zA-Z]?)

regexp\u extract
的第二个参数表示要提取其内容的捕获组的数目。但是,您的正则表达式没有定义捕获组,因此,您需要将
0
作为第二个参数传递

此外,您可以使用
[0-9]
而不是
\d
来避免转义问题

因此,您可以使用

postcodes.select("raw_postcode", 
   regexp_extract('raw_postcode', '^[a-zA-Z]+[0-9]{1,2}[a-zA-Z]?', 0).alias("area")
).show(40, False)
详细信息

  • ^
    -字符串的开头
  • [a-zA-Z]+
    -1+ASCII字母
  • [0-9]{1,2}
    -1或2位数字
  • [a-zA-Z]?
    -可选的ASCII字母

替换
中的
1
,1)。别名(
0
。也可以尝试使用
'^[a-zA-Z]+[0-9]{1,2}[a-zA-Z]?“
@WiktorStribiżew这一个有效!简单而快速。将其作为正式答案添加。您好,您错过了对正则表达式值的探索。@MenakaSankar OP没有错过它,没有必要在此处添加任何分组构造。这是额外的开销(尽管非常小)到正则表达式引擎。请注意,OP regex仅匹配
abc123
中的
abc12
,您的将匹配
abc123
。此外,如果可以直接访问整个匹配,则无需添加额外的外部分组,而且这是可能的。感谢您的解释:)@MenakaSankar你写了一个答案来解释你不知道的事情。你为什么要那样做?