Наложение соответствий в Regex

Итак, сначала я должен был внести эту коррекцию в ваш RDD (который соответствует вашему фактическому выходу):

rdd = sc.parallelize([('X01',41,'US',3),
                      ('X01',41,'UK',1),
                      ('X01',41,'CA',2),
                      ('X02',72,'US',4),
                      ('X02',72,'UK',6),
                      ('X02',72,'CA',7),
                      ('X02',72,'XX',8)])

Как только я сделал эту коррекцию, это сделало трюк:

df.select($"ID", $"Age").groupBy($"ID").agg($"ID", first($"Age") as "Age")
.join(
    df.select($"ID" as "usID", $"Country" as "C1",$"Score" as "US"),
    $"ID" === $"usID" and $"C1" === "US"
)
.join(
    df.select($"ID" as "ukID", $"Country" as "C2",$"Score" as "UK"),
    $"ID" === $"ukID" and $"C2" === "UK"
)
.join(
    df.select($"ID" as "caID", $"Country" as "C3",$"Score" as "CA"), 
    $"ID" === $"caID" and $"C3" === "CA"
)
.select($"ID",$"Age",$"US",$"UK",$"CA")

Не так элегантно, как ваш стержень, конечно.

33
задан PhiLho 27 November 2008 в 23:10
поделиться

3 ответа

Возможное решение могло состоять в том, чтобы использовать положительный взгляд позади :

(?<=n)n

Это дало бы Вам конечное положение:

  1. *n *** n ** nn  
  2. n*n *** n ** n  
  3. nn*n *** n **
<час>

, Как упомянуто Timothy Khouri , положительное предвидение более интуитивно

, я предпочел бы его предложению (?=nn)n более простую форму:

(n)(?=(n))

, Который сослался бы первое положение строк, которые Вы хотите и получили бы второй n в группе (2) .

, Которая является так потому что:

  • Любое действительное регулярное выражение может использоваться в предвидении.
  • , Если это содержит круглые скобки получения, эти , обратные ссылки будут сохранены .

, Таким образом, группа (1) и группа (2) получат любой 'n', представляет (даже если это - сложный regex).

23
ответ дан 27 November 2019 в 17:00
поделиться

Используя предвидение с группой фиксации работает, за счет создания Вашего regex, медленнее и более сложного. Альтернативное решение состоит в том, чтобы сказать Regex. Соответствие () метод, где следующая попытка соответствия должна начаться. Попробуйте это:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}
25
ответ дан 27 November 2019 в 17:00
поделиться

AFAIK, нет никакого чистого regex способа сделать это сразу (т.е. возврат трех получений, которые Вы запрашиваете без цикла).

Теперь, можно найти шаблон однажды, и цикл на поиске, запускающемся со смещения (найденный положением + 1). Должен объединить использование regex с простым кодом.

Большое [РЕДАКТИРОВАНИЕ], я - downvoted, когда я в основном сказал что показанный Jan...
[РЕДАКТИРУЮТ 2], Чтобы быть ясным: ответ Jan's лучше. Не более точный, но конечно более подробный, это имеет право быть выбранным. Я просто не понимаю, почему мой - downvoted, так как я все еще не вижу ничего неправильного в нем. Не грандиозное предприятие, просто раздражающее.

1
ответ дан 27 November 2019 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: